【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("出现异常了......");
        }
        
    }

}

 输出结果截图:

猜你喜欢

转载自www.cnblogs.com/OliverQin/p/12150289.html