大家好,我是
方圆
这里的知识还挺简单的
1. BIO阻塞模型
简述BIO模型中服务端与客户端的响应过程
- 服务器
serverSocket
先要和端口
进行绑定
- 绑定完成后,执行
accept方法
,等待客户端的连接,这个方法是阻塞式调用
,也就是说,要一直等待客户端的连接响应,不做其他事情,一直等,(被阻塞的还有InputStream.read()、OutputStream.write(),这两个也会一直等待客户端的响应) - 客户端创建
Socket
对象,绑定
服务器的ip地址
与端口号
,与服务器进行连接 - 服务器接收到客户端的连接请求,accept方法获取到
客户端的socket信息
,连接成功 - 服务器与客户端创建各自的
io流
,实现全双工通信
- 之后便可以随时
结束连接
2. 简单实战演示
2.1 服务器
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
final int DEFAULT_PORT = 8888;
final String QUIT = "quit";
ServerSocket serverSocket = null;
try {
//绑定端口号
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("服务器已经启动,绑定端口号:" + DEFAULT_PORT);
while (true){
//等待客户端的连接
Socket socket = serverSocket.accept();
System.out.println("客户端" + socket.getPort() + ":" + "已经连接");
//获取io流
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
//读取客户发送的信息
String msg = null;
while ((msg = reader.readLine()) != null) {
System.out.println("客户端" + socket.getPort() + ":" + msg);
//回复消息
writer.write( msg + " ok" +"\n");
writer.flush();
System.out.println("服务器:" + msg + " ok");
if(msg.equals(QUIT)){
System.out.println("客户端" + socket.getPort() + ":断开连接" );
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(serverSocket != null){
try {
serverSocket.close();
System.out.println("服务器Socket关闭");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.2 客户端
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
final int DEFAULT_SERVER_PORT = 8888;
final String DEFAULT_ADDRESS = "127.0.0.1";
final String QUIT = "quit";
Socket socket = null;
BufferedWriter writer = null;
try {
//创建Socket
socket = new Socket(DEFAULT_ADDRESS,DEFAULT_SERVER_PORT);
//创建io流
writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
//等待用户输入信息
while (true) {
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String msg = consoleReader.readLine();
//向服务器发送消息
writer.write(msg + "\n");
writer.flush();
System.out.println("客户端"+ ":" + msg);
String line = reader.readLine();
System.out.println("服务器:" + line);
//退出判断
if(msg.equals(QUIT)){
break;
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.3 响应结果
- 客户端
- 服务器
3. 加深理解
赶赶单单!