34、Android中基于Socket的网络通信(一)

      Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

      在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成需要的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。

 

1,服务器监听。

2,客户端发送请求。

3,建立连接。

4,通信。

 

【Socket特点】

1,Socket基于TCP连接,数据传输有保障。

2,Socket适用于建立长时间连接。

3,Socket编程通常应用于即时通讯。

 1 import java.io.IOException;
 2 import java.net.ServerSocket;
 3 import java.net.Socket;
 4 import javax.swing.JOptionPane;
 5 
 6 public class ServerListener extends Thread {
 7     @Override
 8     public void run() {
 9         try {
10             ServerSocket serverSocket = new ServerSocket(12345);
11             // 循环监听来自客户端的连接
12             while (true) {
13                 // block
14                 Socket socket = serverSocket.accept();
15                 // 建立连接
16       JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");
17                 
18                 // 因为每个Socket都要与一个客户端进行通信。所以要另起一个新的线程。
19                 // 将Socket传递给新的线程。
20                 ChatSocket cs = new ChatSocket(socket);
21                 cs.start();
22                 ChatManager.getChatManager().add(cs);
23             }
24         } catch (IOException e) {
25             // TODO Auto-generated catch block
26             e.printStackTrace();
27         }
28 
29     }
30 }

 

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.UnsupportedEncodingException;
 5 import java.net.Socket;
 6 
 7 /**
 8  * 因为每个Socket都要与一个客户端进行通信。所以要另起一个新的线程。
 9  * 之间是相互独立的,它们之间不能进行数据沟通。
10  * @author dr
11  *
12  */
13 public class ChatSocket extends Thread {
14 
15     Socket socket;
16 
17     public ChatSocket(Socket s) {
18         this.socket = s;
19     }
20     
21     public void out(String out) {  // 发送数据
22         try {
23             socket.getOutputStream().write(out.getBytes("UTF-8"));
24         } catch (UnsupportedEncodingException e) {
25             e.printStackTrace();
26         } catch (IOException e) {
27             e.printStackTrace();
28         }
29     }
30 
31     @Override
32     public void run() {
33 //        int count = 0;
34 //        while (true) {
35 //            count++;
36 //            out("loop+" + count);
37 //            try {
38 //                sleep(500);
39 //            } catch (InterruptedException e) {
40 //                e.printStackTrace();
41 //            }
42 //        }
43         try {
44             /** 当前的服务器会从客户端不断的读取内容 */
45             BufferedReader br = new BufferedReader(new InputStreamReader(
46                     socket.getInputStream(), "UTF-8"));
47             String line = null;
48             // 客户端发送给服务端的数据。
49             while ((line = br.readLine()) != null) {
50                 // 发送给聊天室所有的人。
51                 ChatManager.getChatManager().publish(this, line);
52             }
53             br.close();
54         } catch (UnsupportedEncodingException e) {
55             e.printStackTrace();
56         } catch (IOException e) {
57             e.printStackTrace();
58         }
59     }
60 }

 

 1 import java.util.Vector;
 2 
 3 /**
 4  * 管理新建的线程,实现它们之间的相互通信。 6  * @author dr
 7  */
 8 public class ChatManager {
 9 
10     // 单例化
11     private ChatManager() {
12     }
13 
14     private static final ChatManager cm = new ChatManager();
15 
16     public static ChatManager getChatManager() {
17         return cm;
18     }
19 
20     Vector<ChatSocket> vector = new Vector<ChatSocket>();
21 
22     public void add(ChatSocket cs) {
23         vector.add(cs);
24     }
25 
26     /**
27      * 其中的某个线程,可以通过调用这个函数,向其他的客户端发送信息
28      * 
29      * @param cs
30      *            线程
31      * @param out
32      *            输出的信息
33      */
34     public void publish(ChatSocket cs, String out) {
35         // 发送给集合中所有的线程。
36         for (int i = 0; i < vector.size(); i++) {
37             ChatSocket csChatSocket = vector.get(i);
38             // 当前的线程就不用接收这条信息了。
39             if (!cs.equals(csChatSocket)) {
40                 csChatSocket.out(out);
41             }
42         }
43     }
44 
45 }

 

1 /** 测试类 */
2 public class MyServerSocket {
3    public static void main(String[] args) {
4        // 终端运行测试:telnet localhost 12345;
5        new ServerListener().start();
6    }
7 }

 

【注】MAC系统中,打开多个终端窗口, command + N  或者 command + T(TAB样式) 。

 

posted on 2014-09-16 17:45  大米稀饭  阅读(391)  评论(1编辑  收藏  举报