Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息

题目

  • 客户端:发送一条数据,接收服务端反馈的消息并打印
  • 服务端:接收数据并打印,再给客户端反馈消息

代码实战

1、客户端代码

package com.hidata.hiops.paas.demo;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Description : 客户端
 * @Date: 2023-09-27 10:08
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //创建Socket客户端对象并连接服务端
        Socket socket = new Socket("127.0.0.1",10001);

        //获取输出流
        OutputStream ops = socket.getOutputStream();
        String str = "你好,服务端";
        ops.write(str.getBytes());

        //给服务器写一个结束标记
        socket.shutdownOutput();
        
         //接收服务端回写的数据
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = isr.read()) != -1){
            System.out.print((char)b);
        }

        //释放资源
        socket.close();
    }
}

2、服务端代码

package com.hidata.hiops.paas.demo;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**

  • @Description :服务端

  • @Date: 2023-09-27 10:16
    */
    public class Server {
    public static void main(String[] args) throws IOException {

     //创建服务端对象并绑定端口10001
     ServerSocket serverSocket = new ServerSocket(10001);
    
     //等待客户端来连接
     Socket socket = serverSocket.accept();
    
     //读取数据
     InputStreamReader isr = new InputStreamReader(socket.getInputStream());
     int b;
     while ((b = isr.read()) != -1){
         System.out.print((char)b);
     }
    
     //回写给客户端
     OutputStream ops = socket.getOutputStream();
     ops.write("我收到你的问候咯,你好 客户端!".getBytes());
    
     //释放资源
     socket.close();
     serverSocket.close();
    

    }
    }

3、运行结果

客户端运行结果

我收到你的问候咯,你好 客户端!
Process finished with exit code 0

服务端运行结果

你好,服务端
Process finished with exit code 0

总结

本练习题的核心之处在于:客户端在接收服务端反馈的消息之前,要加上 这句代码

socket.shutdownOutput();

表示 给服务端加一个标记,告诉服务端,客户端这边的数据已经写完了,否则服务端程序会一直停在read方法这里,等待读取下面的数据

 while ((b = isr.read()) != -1){
   System.out.print((char)b);
 }

你可能感兴趣的:(网络编程,网络,开发语言,网络编程,socket,TCP,io流,TCP/ip)