代码基础参考链接,十分感谢。
需求功能:
- 实现客户端与服务器的连接
- 各个客户端能够共享消息界面,即一个客户端发送消息后所有在线客户端都能够收到
- 客户端登录时可以自定义昵称
- 客户端登录后显示已在线成员
- 客户端登录后通知其他在线成员,下线后也通知
- 客户端登录后显示之前的聊天记录
- 服务器断开后能通知各客户端重启
- 启动客户端时若服务器未打开显示提示信息
- 客户端退出后服务器能够提示,登录同
核心思想:
将服务器作为转接的中间站,用集合存储链接的socket、记录和在线成员。
原参考代码会出现的主要问题:
任意关闭一个客户端或关闭服务器时会抛出 java.net.SocketException: Connection reset 的异常,原因是:一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常。因此此处的解决方法为在ServerThread中buf读取数据时加个try-catch块,有异常后进行相应的处理。
运行截图:
代码部分:
Server.java 服务器
package ChatRoomDemo;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
public static List<Socket> list = new ArrayList<>(); // 客户端连接
public static List<String> record = new ArrayList<>(); // 聊天记录
public static List<String> online_member = new ArrayList<>(); // 在线成员
private static ServerSocket server;
public static void main(String[] args) {
try {
server = new ServerSo