简易局域网聊天QQ

简易局域网聊天系统–局域网QQ

服务器端

实现简易的启动停止服务器端操作,能记录基本日志:客户连接、消息传送,能查看连接客户的昵称。

启动服务器后开始监听客户端连接,创建一个新线程实现该监听操作。

// 启动新线程监听客户端
new Thread(new Runnable() {
    public void run() {
        writeLog("开始监听客户端:");
        listen();
    }
}).start();

为每一个客户端连接开启一个新线程处理通讯,包括处理输入流与输出流。

// 每监听到一个客户端连接,启动一个新线程处理该连接
new Participant(this, socket, usersList).start();

获取用户不同的行为实现不同的操作

String flag = in.readUTF(); // 获取用户操作行为
if ("validateUser".equals(flag)) { // 验证用户是否存在
    // ……………………
} else if ("newUser".equals(flag)) { // 新用户登录
    // ……………………
} else if ("message".equals(flag)) { // 用户间发送消息
    // ……………………
} else if ("userList".equals(flag)) { // 获取用户列表
    // ……………………
}

在服务器端,采用Map保存每个客户端对应的套接字:

private Map<String, Socket> usersList = new HashMap<String, Socket>();

key为客户端连接时输入的用户昵称,value为对应的套接字对象。

各客户端用户间发送消息时,通过服务器转发送该信息:

String sender = in.readUTF(); // 发送者
String receiver = in.readUTF(); // 接收者
String message = in.readUTF(); // 消息
// 添加日志
server.writeLog(sender + " 向 " + receiver + "发送消息:" + message);
// 服务器向目标转发消息,先获得要转发后的目标套接字对象
Socket socket = server.getUsersList().get(receiver);
System.out.println(out);
if (socket == null) { // 服务器已删除该客户端连接信息
    out.writeUTF("message");
    out.writeUTF("系统服务器");
    out.writeUTF(receiver + "已退出系统,无法再发送消息");
    out.flush();
} else {
    DataOutputStream thatOut = new DataOutputStream(socket.getOutputStream()); // 创建输出流对象
    if (thatOut != null) {
        thatOut.writeUTF("message");
        thatOut.writeUTF(sender);
        thatOut.writeUTF(message);
        thatOut.flush(); // 写入客户端输出流中
    }
}

客户端

先通过登录窗体实现服务器端连接,然后输入登录用户昵称,如果服务器端还未保存该昵称,则登录成功。登录成功后,可以直接先读取到服务器端已有登录用户的昵称,显示到列表中。双击好友列表中的任一项打开聊天对话框,然后双方可以开始聊天。

创建到服务器的套接字对象:

// 创建套接字对象
socket = new Socket(serverIp.getText().trim(), Integer.parseInt(port.getText().trim()));

连接的服务器与端口从窗体文本框中获取到。

登录成功后,将昵称发送到服务器保存:

out.writeUTF("newUser");
out.writeUTF(nickname);
out.flush();

刷新好友列表:

// 读取流中信息
String flag = in.readUTF();
if ("userList".equals(flag)) { // 好友列表
    String[] userList = in.readUTF().split("::::"); // 获取好友列表,使用标记分隔
    // 创建好友列表模型
    DefaultListModel list = new DefaultListModel();
    for (int i = 0; i < userList.length; i++) {
        list.addElement(userList[i]);
    }
    friends.setModel(list); // 设置模型
    friends.validate(); // 重绘
}

发送消息给某个好友:

out.writeUTF("message");
out.writeUTF(sender);
out.writeUTF(recipient);
out.writeUTF(textArea.getText());
out.flush();

开启新线程读取服务器转发的好友信息:

String flag = in.readUTF();
if ("message".equals(flag)) {
    String sender = in.readUTF();
    String msg = in.readUTF();
    String message = sender + " 对你说:" + msg + "\n";
    jTextArea.append(message);
}

运行效果图:

服务器效果:

服务器运行效果图

客户端效果:

登录界面

登录成功后主界面

聊天界面

聊天界面2

源代码:http://download.csdn.net/download/zhliro/8657263

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值