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();
            }
        }
    }

    测试代码同上,

    效果如下

  • 相关阅读:
    Web 安全 —— XSS攻击的原理
    HTTP缓存
    JavaScript 事件循环机制(Event Loop)
    搭建前端监控系统
    电脑 直接下载cyida deb
    基于样例的传统图像修补算法实现
    Android WorkManager 定时任务
    Android WorkManager工作约束,延迟与查询工作
    微信小程序地图如何显示附近厕所WC步行路线
    物流解决方案再添利器 腾讯位置服务推出货运“三件套”
  • 原文地址:https://www.cnblogs.com/DonAndy/p/6203777.html
Copyright © 2011-2022 走看看