Java Socket编程(阻塞多线程,线程池)

服务端:

主线程Server类

public class Server {
    private static ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(10086);
            while (true){
                System.out.println("正在监听端口号:"+serverSocket.getLocalPort());
                Socket socket = serverSocket.accept();
                System.out.println("连接成功,客户端地址:"+socket.getInetAddress().getHostAddress()+":"+socket.getPort());
                executorService.execute(new SubThread(socket));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

子线程SubThread类

public class SubThread implements Runnable {
    private Socket socket;

    SubThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run(){
        try {
            //输入流
            DataInputStream dis = new DataInputStream(socket.getInputStream());

            while (true){
                String msg = dis.readUTF();
                System.out.println("收到信息:"+msg);
                if(msg.equals("exit"))break;
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

客户端:

public class Client {
    public static void main(String[] args){
        try {
            Socket socket = new Socket("127.0.0.1",10086);

            //输出流
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

            while (true){
                Scanner scanner = new Scanner(System.in);
                System.out.print("输入信息:");
                String str = scanner.nextLine();
                dos.writeUTF(str);
                if (str.equals("exit"))break;
            }

            dos.close();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

测试方法:

首先启动服务端,其次启动多个客户端,客户端启动顺序任意(我就启动两个客户端做测试)。

因为线程池大小固定最大为10个,所以启动的客户端最好不要超过10个。

当然,在Java.util.Concurrent包中有其他类型的线程池能使用,这里不具体讲了。


测试结果:

服务端控制台:

正在监听端口号:10086
连接成功,客户端地址:127.0.0.1:64430
正在监听端口号:10086
收到信息:123
连接成功,客户端地址:127.0.0.1:64444
正在监听端口号:10086
收到信息:456
收到信息:abcd
收到信息:qazwsx

客户端1控制台:

输入信息:123
输入信息:abcd

客户端2控制台:

输入信息:456
输入信息:qazwsx

你可能感兴趣的:(java,socket,IO流,多线程)