Java --- ServerSocket 和 Socket 多线程通信 完整步骤

    Everybody!小编我又回来了。上篇文章:Java — ServerSocket 和 Socket 简单通信 完整步骤 我们讲到了 socket 简单通信,相信各位都有大差不差的了解了。这篇文章呢,咱们继续走起。但是,新的东西着实不多,就加了个多线程处理,用于多客户端消息请求。小编绝对用最生动的表述给各位讲清楚!Let go!

1,建立客户端1。

/**
 * @author: 
 * @description:
 * @date: 2022/4/14
 **/
public class ServerClient1 {

    public static void main(String[] args) throws IOException {
        //1,创建服务器连接,指定Ip,和端口,这个可以根据自己的情况设定
        Socket socket = new Socket("localhost", 8080);
        //2,打开socket 输出流,准备写入数据,要发送给服务器的信息
        OutputStream outputStream = socket.getOutputStream();
        //3,创建printwriter
        PrintWriter printWriter = new PrintWriter(outputStream);
        //4,写入数据
        printWriter.write("你好,我是客户端1号。");
        //5,刷新
        printWriter.flush();

        /**
        * 客户端和服务器端建立连接后,服务器端会持续等待客户端传来的数据,如客户端写入数据后,不执行shutdownOutput。
        * 服务器端会一直等待,客户端和服务器端就会一直处于僵持状态。
        * 执行shutdownOutput,关闭客户端输出流,服务器输入流也随之关闭
        */
        socket.shutdownOutput();

		//6,打开输入流,准备读出从服务器端发来的数据
        InputStream inputStream = socket.getInputStream();
        //7,创建 bufferedreader
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        //8,读取数据
        String msg = "";
        while ( (msg = reader.readLine()) != null){
            System.out.println("这里是客户端1号,服务器端发来:" + msg);
        }

        //9,关闭流。流是一个管道,连接内存和硬盘,用完后如果不关闭,会耗费(占用)很多资源
        reader.close();
        inputStream.close();
        printWriter.close();
        outputStream.close();
    }
}

2,建立客户端2,类似客户端1。

/**
 * @author: 
 * @description:
 * @date: 2022/4/14
 **/
public class ServerClient2 {

    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("localhost", 8080);
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.write("hi,我是客户端2号。");
        printWriter.flush();

        socket.shutdownOutput();

        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String msg = "";
        while ( (msg = reader.readLine()) != null){
            System.out.println("这里是客户端2号,服务器端发来:" + msg);
        }

        reader.close();
        inputStream.close();
        printWriter.close();
        outputStream.close();
    }
}

3,建立服务器端。

/**
 * @author: 
 * @description:
 * @date: 2022/4/14
 **/
public class SocketServerOneTwo {

    public static void main(String[] args) {

        try {
        	//1,创建服务器端serverSocket,监控8080端口,和客户端保持一致
            ServerSocket serverSocket = new ServerSocket(8080);
            //2,创建客户端socket
            Socket socket = new Socket();
            //3,循环监听等待客户端连接
            while (true){
            	//4,监听客户端
                socket = serverSocket.accept();
                //5,创建服务处理线程
                ServerSocketThread socketThread = new ServerSocketThread(socket);
                //6,启动线程
                socketThread.start();
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

4,创建线程类

/**
 * @author: 
 * @description:
 * @date: 2022/4/14
 **/
public class ServerSocketThread extends Thread{

    private Socket socket;
    //构造器
    public ServerSocketThread(Socket socket) {
        this.socket = socket;
    }

    @SneakyThrows
    @Override
    public void run() {
    	//1, 打开输入流,准备读取数据
        InputStream inputStream = socket.getInputStream();
        //2,创建 bufferedreader, 接收读取的数据
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String str = "";
        //3,读取数据
        while ( (str = reader.readLine()) != null){
            System.out.println("这里是服务器端,客户端发来:" + str);
        }
		//4,关闭输入流
        socket.shutdownInput();

		//5,打开输出流,准备写入数据
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.write("你好客户端,这是服务器端,感谢发来消息。");
        printWriter.flush();

        socket.shutdownOutput();

        printWriter.close();
        reader.close();
        inputStream.close();
        outputStream.close();
    }
}

5,测试结果:
(1) 服务器端控制台:

"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" 
这里是服务器端,客户端发来:你好,我是客户端1号。
这里是服务器端,客户端发来:hi,我是客户端2号。

(2) 客户端1控制台:

"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" 
这里是客户端1号,服务器端发来:你好客户端,这是服务器端,感谢发来消息。

Process finished with exit code 0

(3) 客户端2控制台:

"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" 
这里是客户端2号,服务器端发来:你好客户端,这是服务器端,感谢发来消息。

Process finished with exit code 0
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮克克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值