zoukankan      html  css  js  c++  java
  • 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样式) 。

  • 相关阅读:
    jQuery before 和 after
    pm2常用的命令
    git 常见命令
    Number 和 parseInt 区别
    枚举创建单例模式 安全 而且利用反射也读不到
    spring 的数据库工具类 JDBCTemplate
    阿里druid数据库连接及配置文件
    java C3P0连接数据库
    JDBC利用.properties文件连接数据库
    JDBC工具类的使用
  • 原文地址:https://www.cnblogs.com/androidsj/p/3975440.html
Copyright © 2011-2022 走看看