zoukankan      html  css  js  c++  java
  • socket通信

    socket通信

    一:socket基于Tcp连接,数据传输有保证

    二:socket连接的建立过程:

      1:服务器监听

      2:客户端发出请求

      3:建立连接

      4:通信

    三:一个简单的例子:服务器端每隔一段时间发一些信息

    1:创建一个服务器端监听的线程

    public class ServerListener extends Thread {
        public void run() {
            try {
                //服务器端的socket
                ServerSocket serversocket=new ServerSocket(22345);
                while(true){
                    //收到客户端的socket,
                    Socket socket=serversocket.accept();
                    //建立连接,弹窗
                    JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口");
                    
                    //将socket传递到新的线程(socket通信的线程)
                    new ChatSocket(socket).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    通信线程ChatSocket 类继承Thread,重写run()方法:

    public class ChatSocket extends Thread {
        
        Socket socket;
    
        public ChatSocket(Socket socket) {
            super();
            this.socket = socket;
        }
    
        public void out(String out){
            try {
                socket.getOutputStream().write(out.getBytes("utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public void run() {
            int count=0;
            while(true){
                count++;
                out("loop:"+count);
                try {
                    sleep(400);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }    
        }    
        
    }

    新建一个程序测试类

    public class MyServerSocket {
    
        /**在cmd里面是输入telent localhost 22345就可建立连接
         * @param args
         */
        public static void main(String[] args) {
            new ServerListener().start();
        }
    }

    效果如下:

     

    看到这里,可以知道可以同时进行多个客户端的连接

    上面的实例只能是服务器发送消息给客户端,但是客户端不能发送消息,怎么办呢?

    请看下面

    二:多个客户端同时在线通信,一个客户端发送一条消息,然后全部的客户端都可以收到

    这里要新建一个socket管理类,把所有的ChatSocket放在一起,用到了Vector<>,可增长的对象数组

    public class ChatManager {
        
        public void ChatManger(){}
        
        private static final ChatManager cm=new ChatManager();
        
        public static ChatManager getChatManager(){
            return cm;
        }
    
        //Vector 类可以实现可增长的对象数组
        Vector<ChatSocket> vector=new Vector<ChatSocket>();
        
        public void add(ChatSocket cs){
            vector.add(cs);
        }
        
        //发送信息
        public void  publish(ChatSocket cs,String out){
                for(int i=0;i<vector.size();i++){
                    ChatSocket csChatSocket =vector.get(i);
                    if(!cs.equals(csChatSocket)){
                        csChatSocket.out(out);
                    }
                }
        }
    }

    ChatSocket代码完善

    public class ChatSocket extends Thread {
        Socket socket;
        public ChatSocket(Socket socket) {
            super();
            this.socket = socket;
        }
            //写数据
        public void out(String out){
            try {
                socket.getOutputStream().write(out.getBytes("utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        //当前服务器不断地 读取 客户端传来的数据,把接受的数据传到Vector<ChatSocket>集合
        public void run() {
            try {
                BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
    
                String line=null;
                while((line=br.readLine())!=null){
                    ChatManager.getChatManager().publish(this, line);//this是当前线程
                }
                br.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    ServerListener 类
    public class ServerListener extends Thread {
    
        public void run() {
            try {
                //服务器端的socket
                ServerSocket serversocket=new ServerSocket(22345);
                while(true){
                    //收到客户端的socket,
                    Socket socket=serversocket.accept();
                    //建立连接
                    JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口");
                    
                    //将socket传递到新的线程(socket通信的线程)
                    ChatSocket cs=new ChatSocket(socket);
                    cs.start();
                    ChatManager.getChatManager().add(cs);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    测试代码同上,

    效果如下

  • 相关阅读:
    【Linux】项目部署
    【架构师之路】【MQ】消息队列
    【数据库】【Python】mysql
    【算法】【Python】找出字符串中重复出现的字符 并求出重复次数 且根据重复次数从大到小排列
    【Python】排序 按照list中的字典的某key排序
    Kettle Post请求webservice
    python+pytest+allure接口自动化测试框架
    Python+unittest+requests+htmlTestRunner+excel完整的接口自动化框架
    python实现栈的基本操作
    展示博客园顶部的随笔、文章、评论、阅读量统计数据
  • 原文地址:https://www.cnblogs.com/DonAndy/p/6203777.html
Copyright © 2011-2022 走看看