Java即时聊天程序:客户端和服务器端实现
这是一个使用Java语言编写的即时聊天程序,包含客户端应用程序和服务器端后台程序。客户端应用程序提供以下功能:
- 用户注册:选择新用户注册,提交用户名和密码注册新用户。用户名必须为6-20位的数字、字母和下划线组合,密码与用户名要求相同。如果存在同名账户,则禁止注册。
- 用户登录:选择用户登录,输入用户名和密码。系统验证通过后进入聊天系统,否则提示错误并返回登录界面。
- 用户列表显示:选择此菜单后,显示所有用户信息。
- 添加好友:在用户列表中选择用户发送添加好友请求。对方收到提示后可以确认成为好友。
- 两位好友聊天:不同用户在不同机器上运行程序并登录互为好友的账户后,可以互相聊天。如果一方不在线,则另一方发起通信时显示不在线,信息会在对方上线后送达。
- 群聊:
- 群主建立群聊,至少拉入一个好友用户。
- 群中任何一个人都可以拉入自己的好友入群。
- 群中用户可以在参加的群中找到各个参与的群聊,可以选择退出群聊。
- 群组聊天:一位用户在群中发言,所有其他在线用户都能收到。不在线用户上线后能看到最近7天的历史信息(过期信息不必保存)。
- 聊天漫游:用户可以在多个不同客户端(设备)登录,都能收到历史信息。但同时只能有一个设备登录,新设备上线会将旧设备强制下线。
- 刷脸身份认证:增加刷脸身份认证方式。
- 群组聊天分等级:每个等级有不同的人数上限。
由于这是一个比较复杂的项目,需要考虑到各种情况和异常处理,因此建议使用面向对象编程的思想进行设计和实现。下面是一个简单的Java代码示例:
客户端应用程序
public class ChatClient {
private String username;
private String password;
private List<String> friends;
private List<String> groups;
private ChatServer server;
private ChatWindow window;
public ChatClient(String username, String password) {
this.username = username;
this.password = password;
this.friends = new ArrayList<>();
this.groups = new ArrayList<>();
this.server = new ChatServer();
this.window = new ChatWindow();
this.window.setClient(this);
}
public void login() {
boolean success = server.login(username, password);
if (success) {
updateFriendList();
updateGroupList();
window.showChatRoom();
} else {
window.showErrorMessage('Invalid username or password');
}
}
public void register(String username, String password) {
boolean success = server.register(username, password);
if (success) {
window.showSuccessMessage('Registration successful');
window.showLoginPage();
} else {
window.showErrorMessage('Username already exists');
}
}
public void addFriend(String friend) {
boolean success = server.addFriend(username, friend);
if (success) {
friends.add(friend);
window.updateFriendList(friends);
} else {
window.showErrorMessage('Failed to add friend');
}
}
public void createGroup(List<String> members) {
boolean success = server.createGroup(username, members);
if (success) {
groups.add('Group ' + groups.size() + 1);
window.updateGroupList(groups);
} else {
window.showErrorMessage('Failed to create group');
}
}
public void sendMessage(String message, String receiver) {
boolean success = server.sendMessage(username, receiver, message);
if (!success) {
window.showErrorMessage('Failed to send message');
}
}
public void joinGroup(String group) {
boolean success = server.joinGroup(username, group);
if (success) {
groups.add(group);
window.updateGroupList(groups);
} else {
window.showErrorMessage('Failed to join group');
}
}
public void leaveGroup(String group) {
boolean success = server.leaveGroup(username, group);
if (success) {
groups.remove(group);
window.updateGroupList(groups);
} else {
window.showErrorMessage('Failed to leave group');
}
}
public void updateFriendList() {
friends = server.getFriendList(username);
window.updateFriendList(friends);
}
public void updateGroupList() {
groups = server.getGroupList(username);
window.updateGroupList(groups);
}
public void receiveMessage(String message, String sender) {
window.showMessage(message, sender);
}
public void receiveGroupMessage(String message, String group, String sender) {
window.showGroupMessage(message, group, sender);
}
public void showLoginWindow() {
window.showLoginPage();
}
public void showRegisterWindow() {
window.showRegisterPage();
}
}
服务器端后台程序
public class ChatServer {
private Map<String, String> users;
private Map<String, List<String>> friends;
private Map<String, List<String>> groups;
private Map<String, List<String>> groupMembers;
private Map<String, List<String>> offlineMessages;
public ChatServer() {
this.users = new HashMap<>();
this.friends = new HashMap<>();
this.groups = new HashMap<>();
this.groupMembers = new HashMap<>();
this.offlineMessages = new HashMap<>();
}
public boolean login(String username, String password) {
String storedPassword = users.get(username);
if (storedPassword != null && storedPassword.equals(password)) {
return true;
} else {
return false;
}
}
public boolean register(String username, String password) {
if (users.containsKey(username)) {
return false;
} else {
users.put(username, password);
friends.put(username, new ArrayList<>());
groups.put(username, new ArrayList<>());
return true;
}
}
public boolean addFriend(String username, String friend) {
if (friends.containsKey(username) && friends.containsKey(friend)) {
List<String> userFriends = friends.get(username);
List<String> friendFriends = friends.get(friend);
if (!userFriends.contains(friend)) {
userFriends.add(friend);
}
if (!friendFriends.contains(username)) {
friendFriends.add(username);
}
return true;
} else {
return false;
}
}
public boolean createGroup(String username, List<String> members) {
if (!groupMembers.containsKey(username)) {
groupMembers.put(username, new ArrayList<>());
}
List<String> group = new ArrayList<>(members);
group.add(username);
groups.put('Group ' + (groups.size() + 1), group);
for (String member : members) {
if (groupMembers.containsKey(member)) {
groupMembers.get(member).add('Group ' + groups.size());
}
}
return true;
}
public boolean joinGroup(String username, String group) {
if (groups.containsKey(group)) {
List<String> members = groups.get(group);
if (members.contains(username)) {
return true;
} else {
members.add(username);
if (groupMembers.containsKey(username)) {
groupMembers.get(username).add(group);
} else {
groupMembers.put(username, new ArrayList<>(Arrays.asList(group)));
}
return true;
}
} else {
return false;
}
}
public boolean leaveGroup(String username, String group) {
if (groups.containsKey(group)) {
List<String> members = groups.get(group);
if (members.contains(username)) {
members.remove(username);
if (groupMembers.containsKey(username)) {
groupMembers.get(username).remove(group);
}
return true;
} else {
return false;
}
} else {
return false;
}
}
public List<String> getFriendList(String username) {
if (friends.containsKey(username)) {
return friends.get(username);
} else {
return new ArrayList<>();
}
}
public List<String> getGroupList(String username) {
if (groupMembers.containsKey(username)) {
List<String> groupList = new ArrayList<>();
for (String group : groupMembers.get(username)) {
groupList.add(group);
}
return groupList;
} else {
return new ArrayList<>();
}
}
public boolean sendMessage(String sender, String receiver, String message) {
if (users.containsKey(receiver)) {
ChatClient client = getClient(receiver);
if (client != null) {
client.receiveMessage(message, sender);
} else {
saveOfflineMessage(receiver, message, sender);
}
return true;
} else {
return false;
}
}
public boolean sendGroupMessage(String sender, String group, String message) {
if (groups.containsKey(group)) {
List<String> members = groups.get(group);
for (String member : members) {
if (!member.equals(sender)) {
ChatClient client = getClient(member);
if (client != null) {
client.receiveGroupMessage(message, group, sender);
} else {
saveOfflineMessage(member, message, sender);
}
}
}
return true;
} else {
return false;
}
}
private ChatClient getClient(String username) {
// implementation omitted
}
private void saveOfflineMessage(String receiver, String message, String sender) {
if (!offlineMessages.containsKey(receiver)) {
offlineMessages.put(receiver, new ArrayList<>());
}
offlineMessages.get(receiver).add(sender + ': ' + message);
}
}
注意,这只是一个简单的示例,实际应用中还需要考虑很多细节和安全性问题。
原文地址: https://www.cveoy.top/t/topic/nVqS 著作权归作者所有。请勿转载和采集!