前言
使用java.io包下的 API 加多线程实现的简易聊天室,由于属于阻塞式 IO,所以客户端发一条消息后就进入阻塞状态,必须等待服务器的回复,服务器也是同理。所以实用性为 0,全当是回顾一下 IO 流的知识点,也没什么难度,如果是第一次接触或者遇到了问题,建议想把思路想清楚在写代码(自己在写的时候也总被输入输出搞懵)
代码实现
服务器端代码
public class ThreadServer {
public static void main(String[] args) {
try (
// 1. 创建服务器ServerSocket
ServerSocket ss = new ServerSocket(9999);
) {
// 2. 死循环,监听客户端连接
while (true) {
Socket socket = ss.accept();
System.out.println("收到来自:" + socket.getRemoteSocketAddress() + " 的连接");
// 3. 为每个连接创建一个线程来处理
Thread thread = new Handler(socket);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (
InputStream is = this.socket.getInputStream();
OutputStream os = this.socket.getOutputStream();
) {
handle(is, os);
} catch (Exception e) {
try {
this.socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
System.out.println(this.socket.getRemoteSocketAddress() + " 关闭了连接");
}
}
private void handle(InputStream is, OutputStream os) throws IOException {
// 输入流:读取客户端消息
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 输出流:向客户端发送消息
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
Scanner sc = new Scanner(System.in);
bw.write("hello\n");
bw.flush();
while (true) {
// 读取客户端发送的内容
String s = br.readLine();
System.out.println("[Client "+ this.socket.getRemoteSocketAddress() + "]: " + s);
if (s.equals("bye")) {
bw.write("bye\n");
bw.flush();
break;
}
System.out.print("请输入>>> :");
// 向客户端发送内容
String msg = sc.nextLine();
bw.write(msg + "\n");
bw.flush();
}
}
}
客户端代码
public class Client {
public static void main(String[] args) {
try (
// 1. 创建客户端Socket
Socket socket = new Socket("localhost", 9999);
// 2. 输入流,读取服务器消息
InputStream is = socket.getInputStream();
// 3. 输出流,向服务器发送消息
OutputStream os = socket.getOutputStream();
) {
hanlder(is, os);
} catch (Exception e) {
System.out.println("Fail!");
}
}
private static void hanlder(InputStream is, OutputStream os) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
Scanner sc = new Scanner(System.in);
System.out.println("[server]:" + br.readLine());
while (true) {
System.out.print("请输入>>> :");
String s = sc.nextLine();
// 写给服务器
bw.write(s);
bw.newLine();
bw.flush();
String msg = br.readLine();
System.out.println("[Server]: " + msg);
if (msg.equals("bye")) {
break;
}
}
}
}
虽菜但练
如果大佬觉得哪里有问题欢迎评论区指正,请不要使用阴阳怪气、嘲讽、不怀好意的词语,非常感谢。
这是一个简单的Java聊天室实现,利用java.io包的API和多线程,服务器端创建ServerSocket监听客户端连接,每个连接创建单独线程处理。客户端发送消息后会进入阻塞状态,等待服务器响应。代码中包含了服务器端和客户端的处理逻辑,适合回顾IO流知识。由于其阻塞特性,实用性有限。

2282

被折叠的 条评论
为什么被折叠?



