InputStreamReader(ssocket.getInputStream()));
pw = new PrintWriter(ssocket.getOutputStream(), true);
System.out.println("用户" + count + "已加入");
while (true) {
msg = br.readLine();
for (Socket client : clients) {
if (!client.equals(ssocket)) {
pw = new PrintWriter(client.getOutputStream(), true);
pw.println("用户" + count + ": " + msg);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ssocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
【知识点详解】
Java Socket通信是Java网络编程中的基础部分,主要用于实现两台或多台计算机之间的数据传输。在本示例中,我们看到一个简单的Java聊天室应用,它由两部分组成:Server和Client。
1. **Server端**:
- `ServerSocket` 类用于创建监听特定端口(在这个例子中是8083)的服务器,等待客户端连接。`server.accept()` 方法阻塞,直到有客户端连接到服务器。
- `ArrayList<Socket>` 存储已连接的客户端Socket对象,以便向所有在线用户广播消息。
- `Mythread` 类是线程类,每个客户端连接都会创建一个新的线程实例,用于处理与该客户端的交互。收到的消息会广播给其他所有客户端。
2. **Client端**:
- `Socket` 类代表网络连接,通过构造函数与指定的IP地址(这里是本地主机127.0.0.1)和端口建立连接。
- `Cthread` 类也是线程类,负责从控制台读取用户的输入并发送到服务器,同时接收服务器发来的消息并打印到控制台。
3. **网络通信**:
- `BufferedReader` 和 `PrintWriter` 分别用于读写网络流。`readLine()` 用于读取来自服务器的整行文本,而 `println()` 用于将消息写入网络流,然后由另一端读取。
4. **多线程**:
- 在服务器端,每个连接的客户端都有一个独立的线程(`Mythread`),这样服务器可以同时处理多个客户端的请求,提高了并发性能。
- 在客户端,`Cthread` 线程用于监听用户的输入并发送到服务器,使得用户可以实时地进行聊天。
5. **数据传输**:
- 消息通过Socket的输入/输出流在客户端和服务器之间传递,这里使用的是文本格式。在实际应用中,可能需要对数据进行序列化或编码,以适应更复杂的数据结构。
6. **异常处理**:
- 示例代码中对可能出现的IOException进行了捕获和处理,这是Java网络编程中常见的做法,确保程序在遇到网络问题时能够优雅地失败。
这个Java Socket聊天室实例展示了如何使用Java进行基本的网络通信,包括服务器的建立、客户端的连接、多线程处理以及数据的发送和接收。在实际开发中,可以根据需求进行扩展,例如添加用户名认证、消息加密、聊天记录存储等功能。