您的位置:首页 > 其它

简易局域网聊天QQ

2015-05-03 19:07 218 查看

简易局域网聊天系统–局域网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);
}


运行效果图:

服务器效果:



客户端效果:









源代码:http://download.csdn.net/download/zhliro/8657263
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: