2.Java模拟BIO请求响应

60 阅读1分钟

使用了junit4.12

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

案例详情

package _7jvm;
​
import org.junit.Test;
​
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
​

public class IOTest {
​
​
    @Test
    public void client() {
​
        Socket socket = null;
        OutputStream outputStream = null;
        InputStream inputStream=null;
        try {
            //1.创建客户端对象,并指定连接的IP地址或主机名+端口号
            socket = new Socket("127.0.0.1", 9999);
​
            //2.获取这个通道的流,输出数据到通道中
            outputStream = socket.getOutputStream();
​
            //3.发送数据
            outputStream.write("你好".getBytes());
            socket.shutdownOutput();//通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据
​
​
            //4.接受响应
            inputStream=socket.getInputStream();
            byte[] bys = new byte[1024];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bys)) != -1) {
                sb.append(new String(bys, 0, len,"UTF-8"));
            }
            System.out.println("Client:收到响应:"+sb.toString());
​
        } catch (Exception e) {
            e.printStackTrace();
​
        } finally {
​
            //5.关闭资源
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
​
                if (outputStream != null) {
                    outputStream.close();
                }
​
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
​
​
    @Test
    public void server() {
​
        ServerSocket server=null;
        Socket socket=null;
        InputStream inputStream=null;
        OutputStream outputStream = null;
        try {
            //1.创建客户端对象,并绑定端口
            server = new ServerSocket(9999);
​
            //2.阻塞监听通道,有数据传输就返回一个Socket对象
            socket = server.accept();
            inputStream = socket.getInputStream();
            byte[] bys = new byte[1024];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bys)) != -1) {//只有当客户端关闭它输出流的时候,服务端才能取得结尾的-1
                sb.append(new String(bys, 0, len, "UTF-8"));
            }
​
            //3.解析数据
            System.out.println("Server:收到请求:"+sb.toString());
            System.out.println("Server:模拟延迟3s");
            TimeUnit.SECONDS.sleep(3);
​
            //4.响应客户端
            outputStream = socket.getOutputStream();
            outputStream.write("OK".getBytes());
​
​
​
        } catch (Exception e) {
            e.printStackTrace();
​
        } finally {
​
            //5.关闭资源
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
​
                if (inputStream != null) {
                    inputStream.close();
                }
​
                if (socket != null) {
                    socket.close();
                }
​
                if (server != null) {
                    server.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
​
​
//Server打印
Connected to the target VM, address: '127.0.0.1:58927', transport: 'socket'
Server:收到请求:你好
Server:模拟延迟3s
​
//Client打印
Connected to the target VM, address: '127.0.0.1:58943', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:58943', transport: 'socket'
Client:收到响应:OK //3秒后打印