简易局域网聊天QQ

news/2024/11/17 3:39:09/

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


http://www.ppmy.cn/news/933714.html

相关文章

Vtalk局域网聊天室 基于Python

服务端&#xff1a; #作者:吴子豪 #服务器启动程序 import os import threading,socket,time,datetime,sys#每次运行都清空日志 saveservermsgopen("#Serverlog.hst", w) saveservermsg.close()#服务器配置 hostsocket.socket(socket.AF_INET,socket.SOCK_STREAM) h…

Web聊天室

目录 一&#xff0c;简介 二&#xff0c;开发环境 三&#xff0c;涉及的技术 四&#xff0c;主要功能 1.注册功能 2.登录功能 3.异地登陆&#xff08;第一次登录网页会被强制退出&#xff09; 4.发送消息 5.接收消息 6.注销登录 五&#xff0c;准备工作 1.引入开发…

局域网聊天系统-Java

这个局域网聊天系统&#xff0c;是为了能够在一个没有连接到intent的局域网中&#xff0c;进行聊天的一个程序。本程序包括服务器和客户机两部分&#xff0c;可以实现多人聊天和两个人私聊的一个工具。 开发语言&#xff1a;Java&#xff0c;开发工具&#xff1a;eclipse。 客户…

Java实现局域网聊天软件分享

前言 翻翻u盘里面的东西,发现了自己以前实现的局域网聊天软件。这里共享出来给各位学习 Java的童鞋。对知识的渴望源自于人的内心&#xff0c;对知识的分享也源自于人的本性。 功能罗列 啥功能笔者就不去重新实践了&#xff0c;简单的罗列下功能列表&#xff1a; 1. 消息发送&a…

Java实现多线程局域网聊天室

Java多线程局域网聊天室 局域网聊天室1.TCP2.套接字3.C/S架构4.多线程5.服务器客户端 局域网聊天室 在学习了一个学期的java以后&#xff0c;觉得java真是博大精深&#xff0c;彻底放弃了因为c而轻视java的心态&#xff0c;搞了一个多线程的聊天室&#xff0c;熟悉了一下服务器…

局域网内互发消息

主机相互发送消息 背景 本学期的计算机网络课非常有意思&#xff0c;它与我们的生活息息相关&#xff0c;曾经我也为电脑发生的网络问题而困惑&#xff0c;总是没有根据的瞎尝试来试图解决问题。但是在老师的一些简单指导之后&#xff0c;有了一个基本的ip之间通信以及局域网…

基于java编写局域网多人聊天室

基于java编写局域网多人聊天室 由于需要制作网络计算机网络课程设计&#xff0c;并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西&#xff0c;最后决定使用socket基于java编写一个局域网聊天室&#xff1a; 关于socket以及网络编程的相关知识详见我另一篇文…

Java实战_局域网多人聊天室

由于需要制作网络计算机网络课程设计&#xff0c;并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西&#xff0c;最后决定使用socket基于java编写一个局域网聊天室&#xff1a; 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于…