zoukankan      html  css  js  c++  java
  • 【BigData】Java基础_socket编程中使用多线程

    在socket通信中使用多线程,主要为了解决当某个socket出现通信异常时候,导致通信阻塞,整个socket无法正常运行,处于等待状态,有了多线程,那么每个socket之间则可以独立运行,互不干扰。

    以下是一个具体实现案例

    客户端:ClientDemo.java

    package cn.test.logan.day13.ThreadSocket;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
        public static void main(String[] args) throws Exception {
            while(true) {
                // 向服务端发出建立连接的请求
                Socket sc = new Socket("localhost",9998);
                //从连接拿到一个发数据的工具
                OutputStream out = sc.getOutputStream();
                
                // 发送第1个问题
                out.write("你是谁?".getBytes());
                
                // 接收第1个问题的答案
                InputStream in = sc.getInputStream();
                byte[] b = new byte[1024];
                int num = in.read(b);
                System.out.println("接收到第1个答案是:" + new String(b,0,num) );
                
                // 发送第2个问题
                out.write("你几岁了?".getBytes());
                // 接收第2个问题的答案
                num = in.read(b);
                System.out.println("接收到第2个答案是:" + new String(b,0,num) );
                in.close();
                out.close();
                sc.close();
            }
        }
    }

    服务端代码主方法:ServerDemo.java

    package cn.test.logan.day13.ThreadSocket;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 在socket中使用多线程
     * @author QIN
     *
     */
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(9998);
            int i=1;
            while(true) {
                Socket sc = ss.accept();
                System.out.println("收到第"+i+"个客户端连接");
                SocketDemo socketDemo = new SocketDemo(sc);
                Thread thread = new Thread(socketDemo);
                thread.start();
                i++;
            }
            
        }
    }

     服务端代码实现方法:SocketDemo.java

    package cn.test.logan.day13.ThreadSocket;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class SocketDemo implements Runnable{
        
        private Socket sc;
        // 定义构造方法
        public SocketDemo(Socket sc) {
            this.sc = sc;
        }
        @Override
        public void run() {
            try {
                // 获得输入输出流
                InputStream in = sc.getInputStream();
                OutputStream out = sc.getOutputStream();
                
                byte[] b = new byte[1024];
                
                // 接收第一个问题
                int num = in.read(b);
                System.out.println("收到来自客户端的问题1:"+new String(b,0,num));
                
                // 给客户端发送第一个问题的答案
                out.write("我是logan".getBytes());
                
                // 接收第二个问题
                num = in.read(b);
                System.out.println("收到来自客户端的问题2:"+new String(b,0,num));
                
                // 给客户端发送第二个问题的答案
                out.write("我22岁".getBytes());
                
                // 关闭流与连接
                in.close();
                out.close();
                sc.close();
                
            }catch (Exception e){
                System.out.println("出现异常了......");
            }
            
        }
    
    }

     输出结果截图:

  • 相关阅读:
    moss文档库操作的几个类
    Infopath web浏览中的多项选择功能
    国际软件项目经理的七大素质转
    InfoPath中的Rich Text Box中如何加“回车”
    设计模式——策略模式
    设计模式——状态模式
    设计模式——备忘模式
    设计模式——中介者模式
    关与BaseDataList类型绑定ArrayList
    设计模式——命令模式
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12150289.html
Copyright © 2011-2022 走看看