一.JAVA聊天室项目
文件发送
使用 Java Socket 实现聊天内容或文件的传输的原理如下:
- 服务器端启动:聊天室的服务器端在指定的端口上监听客户端的连接。它创建一个 ServerSocket 对象,并通过调用 accept() 方法等待客户端的连接请求。
- 客户端连接:聊天室的客户端通过创建一个 Socket 对象并指定服务器的地址和端口,与服务器建立连接。客户端和服务器之间的连接建立后,可以进行数据传输。
- 服务器端接收消息:当客户端连接到服务器后,服务器会为每个客户端创建一个独立的线程,用于处理与该客户端的通信。在服务器端的线程中,通过调用输入流的 readLine() 方法读取客户端发送的消息。服务器可以根据接收到的消息类型(例如普通消息或文件传输请求),采取相应的处理逻辑。
- 服务器端广播消息:服务器在接收到客户端发送的消息后,可以将该消息广播给其他连接到服务器的客户端。通过遍历保存所有客户端的列表,并调用相应客户端的输出流发送消息给客户端。
- 客户端发送消息:客户端可以通过输出流向服务器发送消息。客户端将消息写入输出流,然后通过网络发送给服务器。
- 客户端接收消息:客户端在一个独立的线程中通过输入流不断监听服务器端的消息。通过调用输入流的 readLine() 方法读取服务器端发送的消息,并进行相应的处理,如将消息显示在用户界面上。
- 文件传输:客户端可以通过输入流读取文件内容,并通过输出流将文件数据发送给服务器。服务器在接收到文件数据后,可以将文件广播给其他客户端。
以上就是使用 Java Socket 实现简易多人聊天室传输聊天内容或文件的基本原理。通过建立客户端和服务器之间的连接,以及使用输入流和输出流进行数据的读写,可以实现实时的聊天和文件传输功能。
实现代码:
1.首先用文件选择器选择文件,将文件分片传送到服务端
private static void sendFile(File file, String filename, File selectedFile) throws IOException {
int length = 1024 * 1024 * 5;
byte[] bytes = new byte[length];
int number = (int) Math.ceil((double) selectedFile.length() / length);
FileInputStream fileInputStream = new FileInputStream(selectedFile.getPath());
message tomessage = new message(messagetype, user, markTool.filemessage, filename, null, chatgroup, otheruser);
connection.oos.writeObject(tomessage);
for (int i = 0; i < number; i++) {
byte[] buffer = new byte[length];
int bytesRead = fileInputStream.read(buffer);
message filemessage = new message(buffer, true);
connection.oos.writeObject(filemessage);
}
byte[] buffer = new byte[length];
int bytesRead = fileInputStream.read(buffer);
message filemessage = new message(buffer, false);
connection.oos.writeObject(filemessage);
System.out.println("文件发送完成,共发送了 " + number + " 个文件块。");
}
2.服务端接收到文件,并将文件下载到服务端,将下载的地址保存到数据库中
else if (mge1.messagetip.equals(markTool.filemessage)) {
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
try {
String path = "E:\\server\\src\\file" + "\\" + mge1.Textmessage;
File file = new File(path);
FileOutputStream fos = new FileOutputStream(file);
while (true) {
message getmessage = (message) ois.readObject();
if (!getmessage.flag) {
fos.write(getmessage.Filebytes);
fos.flush();
break;
}
fos.write(getmessage.Filebytes);
fos.flush();
}
fos.close();
// 更新聊天记录
message getmessage = new message();
new add(mge1, getmessage).addchattingrecords("filemessage", path, formattedDateTime);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
});
threadB.start();
try {
threadB.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
3.下载文件同理,从服务器中数据库找到下载的路径,找到文件,再传递给客户端,客户端在通过用户选择文件路径下载.
二.聊天室项目构思
发起群聊:
从好友表选取人发送到服务器,服务器随机生成不重复的群号,存储在数据库,同时建立中间表,处理用户与群聊的关系
申请入群:
输入群号,发消息给服务器,服务器查询是否存在该群,若存在,查找群主和管理员,若群主,管理员等人在线,实时发送接收,若不在线下次登录成功提醒
发送消息:
若发送的人在线且在你的这个界面,实时接收更新,若在线不在你的这个界面,发出提醒,若不在线,下次登录提醒
退出群聊:发送消息,服务器删除相应数据
删除好友:
给服务器发送信息,服务器删除相应的数据,若被删的好友在线,实时更新
设置群消息
根据用户是否是群主和管理员是否能执行,修改保存后,发送给服务器,服务器更新相应数据
解散群聊
只有群主能够执行,发送请求给服务器,服务器删除群聊数据
群管理:
修改群头像,设置管理员