简易局域网聊天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
相关文章推荐
- python编写简易聊天室实现局域网内聊天
- VS2010/MFC:一个简易的恶作剧QQ好友的聊天轰炸机
- Java实现简易聊天软件_类QQ(含课程论文、实施计划书、演示视频、答辩PPT、源代码及运行环境)
- java学习笔记: 实现简易局域网聊天程序
- python编写简易聊天室实现局域网内聊天功能
- Java Swing 局域网的聊天--山寨QQ(增加了例子源码和mysql脚本)
- java实现简易局域网聊天功能
- Java实现简易QQ聊天
- 分享:我的局域网QQ Bing(必应)1.0 正式发布,包括:聊天、视频、语音、电话、截屏、文件传输 等
- 高仿QQ界面 局域网聊天与文件传输平台(演示 & C++源代码)
- [java]局域网简易聊天
- 分享:企业内部通信 〖局域网QQ〗Bing(必应)1.0 正式发布,包括:聊天、视频、语音、电话、截屏、涂鸦、文件传输 等
- QQ聊天功能在局域网中的实现
- asp.net导步处理实战之类似QQ的简易网页聊天
- 基于Qt的QQ局域网聊天
- [java]局域网简易聊天
- [java]局域网简易聊天
- 利用socket实现简易聊天程序
- winform模拟qq聊天界面的小功能textbox1输入自动跳到textbox2
- Andoid - 开发实例(4):简易在线聊天实现 (Client+Server)