Android 网络编程 Socket

简介:

 1.服务端开发

创建一个Java程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public  class  MyServer {
 
     // 定义保存所有的Socket,与客户端建立连接得到一个Socket
     public  static  List<Socket> socketList =  new  ArrayList<Socket>();
 
     public  static  void  main(String[] args)  throws  IOException {
 
         ServerSocket server =  new  ServerSocket( 8888 );
 
         while  ( true ) {
             System.out.println( "start listening port 8888" );
             Socket socket = server.accept();
             System.out.println( "connect succeed." );
             socketList.add(socket);
             //每当客户端连接之后启动一条ServerThread线程为该客户端服务   
              new  Thread( new  MyServerRunnable(socket)).start();  
 
 
         }
     }
 
     public  static  class  MyServerRunnable  implements  Runnable {
         // 定义当前线程处理的Socket
         Socket socket =  null ;
         // 该线程所处理的Socket所对应的输入流
         BufferedReader bufferedReader =  null ;
 
         public  MyServerRunnable(Socket socket) {
             this .socket = socket;
             try  {
                 // 将服务器端的输入流的数据放入读Buffer中
                 bufferedReader =  new  BufferedReader( new  InputStreamReader(
                         socket.getInputStream()));
             catch  (Exception e) {
                 e.printStackTrace();
             }
 
         }
 
         @Override
         public  void  run() {
             String content =  null ;
             // 采用循环不断的从Socket中读取客户端发送过来的数据
             while  ((content = readFromClient()) !=  null ) {
                 // 遍历socketList中的每一个Socket,将读取的内容向每个Socket发送一次
                 for  (Socket socket : MyServer.socketList) {
                     OutputStream outputStream;
                     try  {
                         outputStream = socket.getOutputStream();
                         outputStream.write(( "Server: "  + content +  "\n" ).getBytes( "utf-8" ));
                     catch  (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
 
         }
 
         // 定义读取客户端的信息
         public  String readFromClient() {
             try  {
                 return  bufferedReader.readLine();
             catch  (Exception e) {
                 e.printStackTrace();
             }
             return  null ;
         }
 
     }
 
}

 2. 创建一个Android程序

1) Layout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     xmlns:tools= "http://schemas.android.com/tools"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     android:gravity= "center"
     android:orientation= "vertical"
     tools:context= ".MainActivity"  >
 
     <TextView
         android:id= "@+id/show"
         android:layout_width= "wrap_content"
         android:layout_height= "wrap_content"
         android:text= "显示接收到服务器端数据"  />
 
     <Button
         android:id= "@+id/send"
         android:layout_width= "match_parent"
         android:layout_height= "wrap_content"
         android:text= "发送数据到服务器端"  />
 
</LinearLayout>

 2)ClientThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package  com.example.testclient;
 
import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.net.InetSocketAddress;
import  java.net.Socket;
import  java.net.SocketTimeoutException;
 
import  android.os.Handler;
import  android.os.Looper;
import  android.os.Message;
import  android.util.Log;
 
public  class  ClientThread  implements  Runnable {
     private  Socket s;
     // 定义向UI线程发送消息的Handler对象
     Handler handler;
     // 定义接收UI线程的Handler对象
     Handler revHandler;
     // 该线程处理Socket所对用的输入输出流
     BufferedReader br =  null ;
     OutputStream os =  null ;
 
     public  ClientThread(Handler handler) {
         this .handler = handler;
     }
 
     @Override
     public  void  run() {
         s =  new  Socket();
         Log.d( "111111111111" "@@@@@@@@@@@@@@@@@@@@" );
         try  {
               //192.168.0.26 为PC IP地址。<br><br>          s.connect(new InetSocketAddress("192.168.0.26", 8888), 5000);
             Log.d( "111111111111" "$$" );
             br =  new  BufferedReader( new  InputStreamReader(s.getInputStream()));
             os = s.getOutputStream();
 
             // 启动一条子线程来读取服务器相应的数据
             new  Thread() {
 
                 @Override
                 public  void  run() {
                     String content =  null ;
                     // 不断的读取Socket输入流的内容
                     try  {
                         while  ((content = br.readLine()) !=  null ) {
                             // 每当读取到来自服务器的数据之后,发送的消息通知程序
                             // 界面显示该数据
                             Message msg =  new  Message();
                             msg.what =  0x123 ;
                             msg.obj =  content;
                             handler.sendMessage(msg);
                             Log.d( "111111111111" , content);
                         }
                     catch  (IOException io) {
                         io.printStackTrace();
                     }
                 }
 
             }.start();
             // 为当前线程初始化Looper
             Looper.prepare();
             // 创建revHandler对象
             revHandler =  new  Handler() {
 
                 @Override
                 public  void  handleMessage(Message msg) {
                     // 接收到UI线程的中用户输入的数据
                     if  (msg.what ==  0x345 ) {
                         // 将用户在文本框输入的内容写入网络
                         try  {
                             os.write(( "Client"  + msg.obj.toString() +  "\r\n" )
                                     .getBytes( "utf-8" ));
                         catch  (Exception e) {
                             e.printStackTrace();
                         }
                     }
                 }
 
             };
             // 启动Looper
             Looper.loop();
 
         catch  (SocketTimeoutException e) {
             Message msg =  new  Message();
             msg.what =  0x123 ;
             msg.obj =  "网络连接超时!" ;
             handler.sendMessage(msg);
         } catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
 
     }
 
}

 3. MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public  class  MainActivity  extends  Activity {
 
     Handler handler;
     // 定义与服务器通信的子线程
     ClientThread clientThread;
     TextView show;
     Button send;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         show = (TextView)  this .findViewById(R.id.show);
         send = (Button)  this .findViewById(R.id.send);
 
         send.setOnClickListener( new  View.OnClickListener() {
 
             @Override
             public  void  onClick(View arg0) {
                 // TODO Auto-generated method stub
                 try  {
                     // 当用户按下按钮之后,将用户输入的数据封装成Message
                     // 然后发送给子线程Handler
                     Message msg =  new  Message();
                     msg.what =  0x345 ;
                     msg.obj =  "Android 网络编程--Socket通信编程" ;
                     clientThread.revHandler.sendMessage(msg);
 
                 catch  (Exception e) {
                     e.printStackTrace();
                 }
             }
         });
         handler =  new  Handler() {
             @Override
             public  void  handleMessage(Message msg) {
                 // 如果消息来自子线程
                 if  (msg.what ==  0x123 ) {
                     // 将读取的内容追加显示在文本框中
                     show.append( "\n"  + msg.obj.toString());
                     show.setTextSize( 50 );
                 }
             }
         };
         clientThread =  new  ClientThread(handler);
         // 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
         new  Thread(clientThread).start();
 
     }
 
 
}

 参考:http://blog.csdn.net/thanksgining/article/details/43561053


本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/5124061.html,如需转载请自行联系原作者

目录
相关文章
|
16天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
16天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
15天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
39 6
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
3天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
11天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
10 0
|
11天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
10 0
|
15天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
19天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
20天前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。