Java 基于BIO实现 Client与Server通信
程序员文章站
2022-05-23 08:36:41
...
基于BIO实现 Client与Server通信
1、简述BIO模型中服务端与客户端的响应过程
根据上图可清晰看出,Client与Server的响应流程如下:
1、Server 服务器端 serverSocket
先要和端口
进行绑定
ServerSocket serverSocket = new ServerSocket(6767);
2、绑定完成后,通过accept方法
,阻塞式等待客户端的连接,这个方法是阻塞式调用
,直到有客户端连接才往下执行;
Socket accept = serverSocket.accept();
3、客户端创建Socket
对象,绑定
服务器的ip地址
与端口号
,与服务器进行连接
//建立socket连接 host=127.0.0.1 port=6767
socket = new Socket(host, port);
4、服务器接收到客户端的连接请求,accept方法获取到客户端的socket信息
,连接成功
服务器与客户端创建各自的io流
,实现全双工通信
2、案例实现
客户端:
package com.xiaojie.net;
import java.io.*;
import java.net.Socket;
/**
* @author Mrli
* @date 2020/9/25 19:36
*/
public class Client {
public static void main(String[] args) {
final String host = "127.0.0.1";
final int port = 6767;
final String QUIT = "quit";
Socket socket = null;
BufferedReader reader = null;
BufferedWriter writer = null;
try {
//建立socket连接
socket = new Socket(host, port);
//获取输入字符流
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()
));
//获取输出字符流
writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()
));
//获取输入字符流
BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String msg = scan.readLine();
//向服务器发送消息
writer.write(msg + "\n");
writer.flush();
//接收消息
String line = reader.readLine();
System.out.println("server:" + line);
if (msg.equals(QUIT)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer != null) {
try {
writer.close();
System.out.println("Client close!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端:
package com.xiaojie.net;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Mrli
* @date 2020/9/25 19:37
*/
public class Server {
public static void main(String[] args) {
final int port = 6767;
final String QUIT = "quit";
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
System.out.println("服务器已启动,监听端口:" + port);
while(true) {
Socket accept = serverSocket.accept();
System.out.println("客户端" + accept.getPort() + ":" + "已经连接");
//获取输入字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(
accept.getInputStream()
));
//获取输出字符流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
accept.getOutputStream()
));
String msg = null;
while ((msg = reader.readLine()) != null ) {
//接收消息
System.out.println("client[" + accept.getPort() + "]:" +msg);
//转发到Client,
writer.write( msg + "\n");
writer.flush();
if(msg.equals(QUIT)) {
System.out.println("client close!");
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
client端:
服务端:
BIO学习到这里,后面IO学习继续更新!