一、BIO是什么?
BIO:Blocking I/O,同步阻塞I/O模式,数据的读取和写入必须阻塞在一个线程内等待其完成。 模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。
二、服务器客户端通信实现
1.服务方
代码如下(示例):
package com.ccw.api;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* @version 1.0
* @projectName:com.ccw.api
* @packageName:test
* @className:SocketServer
* @Description:[一句话描述该类的功能]
* @Author:qhj
* @CreateDate:2021/4/10 11:34
* @blog:[方法具体上行/下行参数文档]
*/
public class SocketServer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
ServerSocket socket = new ServerSocket(10000);
System.out.println("等待客户端连接...");
// 同步阻塞,直到建立连接
Socket client = socket.accept();
// 发送数据
new Thread(() -> {
try {
// 有客户端连接了,发送一个消息给客户端
OutputStream output = client.getOutputStream();
while (true) {
String str = scanner.nextLine();
output.write(str.getBytes());
output.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
while (true) {
System.out.println("客户端已连接:" + client.getPort());
try {
InputStream input = client.getInputStream();
byte[] bytes = new byte[1024];
// 同步阻塞 读取客户端数据 直到输入数据
while (input.read(bytes) != -1) {
System.out.println("收到客户端消息:" + new String(bytes));
}
} catch (IOException ex) {
// 客户端链接断开则引发异常
System.err.println("引发异常:" + ex.getMessage());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.客户端
代码如下(示例):
package com.ccw.api;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* @version 1.0
* @projectName:com.ccw.api
* @packageName:test
* @className:SocketClient
* @Description:[一句话描述该类的功能]
* @Author:qhj
* @CreateDate:2021/4/10 11:35
* @blog:[方法具体上行/下行参数文档]
*/
public class SocketClient {
public static void main(String[] args) {
try {
// 接收控制台用户输入的数据
Scanner scanner = new Scanner(System.in);
// 要绑定的主机和端口号
Socket socketClient = new Socket("127.0.0.1", 10000);
// 启动线程监听服务端发送的消息
new Thread(() -> {
try {
InputStream input = socketClient.getInputStream();
byte[] bytes = new byte[1024 * 4];
while ((input.read(bytes)) != -1) {
System.out.println("收到服务端消息:" + new String(bytes));
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
OutputStream output = socketClient.getOutputStream();
while (true) {
String str = scanner.nextLine();
if ("exit".equals(str)) {
output.close();
socketClient.close();
break;
} else {
// 向服务端发送消息
output.write(str.getBytes());
output.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结
C/S模型:客户端服务器端模式服务器端:Serversocket一个服务器域名,bind绑定端口,listen(三次握手)监听队列,accept返回当前链接的客户端信息,send/recv交流信息,close(四次挥手)通道关闭
客户端:socket一个客户端域名,connect(三次握手)建立连接通道,send/recv交流信息,close(四次挥手)关闭通道