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 }

34、Android中基于Socket的网络通信(一)_第1张图片

 

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

 

你可能感兴趣的:(android)