项目源码:你和我的畅聊时光
一、主要功能
- 注册,成为我们的注册会员用户,你将拥有全网唯一的ID。
- 登录,进入拥有千万好友的畅聊空间。
- 私聊,你可以选择和任意在线用户进行一次亲密对话。
- 群聊,只要你想,没有不可以。你们的团体就是一个小群组。
二、具体实现
1.服务器与客户端的连接
服务器加载所有的配置信息,包括数据库的密码等。服务器根据Socket与客户端连接,服务器根据收到的不同类型信息而进行不同的操作。如1代表用户注册操作。
1.注册:将用户信息存储到服务器。登录后将新上线的用户信息发回给当前已在线的所有用户。
2.私聊:服务器会检测到所有的私聊信息以及发送方和接收方。
3.注册群:群名和群成员信息存储在Map集合中。
4.群聊:服务器会接收到所有的群聊消息,并发送给群聊内的每一个用户。
public class MultiThreadServer {
private static final String IP;
private static final int PORT;
// 缓存当前服务器所有在线的客户端信息
private static Map<String, Socket> clients = new ConcurrentHashMap<>();
// 缓存当前服务器注册的所有群名称以及群好友
private static Map<String,Set<String>> groups = new ConcurrentHashMap<>();
static {
Properties pros = CommUtils.loadProperties("socket.properties");
IP = pros.getProperty("address");
PORT = Integer.parseInt(pros.getProperty("port"));
}
private static class ExecuteClient implements Runnable {
private Socket client;
private Scanner in;
private PrintStream out;
public ExecuteClient(Socket client) {
this.client = client;
try {
this.in = new Scanner(client.getInputStream());
this.out = new PrintStream(client.getOutputStream(),
true,"UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
if (in.hasNextLine()) {
String jsonStrFromClient = in.nextLine();
MessageVO msgFromClient =
(MessageVO) CommUtils.json2Object(jsonStrFromClient,
MessageVO.class);
// 新用户注册到服务端
if (msgFromClient.getType().equals("1")) {
String userName = msgFromClient.getContent();
// 将当前在线的所有用户名发回客户端
MessageVO msg2Client = new MessageVO();
msg2Client.setType("1");
msg2Client.setContent(CommUtils.object2Json(
clients.keySet()
));
out.println(CommUtils.object2Json(msg2Client));
// 将新上线的用户信息发回给当前已在线的所有用户
sendUserLogin("newLogin:"+userName);
// 将当前新用户注册到服务端缓存
clients.put(userName,client);
System.out.println(userName+"上线了!");
System.out.println("当前聊天室共有"+
clients.size()+"人");
}
else if (msgFromClient.getType().equals("2")) {
// 用户私聊
// type:2
// Content:myName-msg
// to:friendName
String friendName = msgFromClient.getTo();
Socket clientSocket = clients.get(friendName);
try {
PrintStream out = new PrintStream(clientSocket.getOutputStream(),
true,"UTF-8");
MessageVO msg2Client = new MessageVO();
msg2Client.setType("2");
msg2Client.setContent(msgFromClient.getContent());
System.out.println("收到私聊信息,内容为"+msgFromClient.getContent());
out.println(CommUtils.object2Json(msg2Client));
} catch (IOException e) {
e.printStackTrace();
}
}else if (msgFromClient.getType().equals("3")) {
// 注册群
String groupName = msgFromClient.getContent();
// 该群的所有群成员
Set<String> friends = (Set<String>) CommUtils.json2Object(
msgFromClient.getTo(),Set.class);
groups.put(groupName,friends);
System.out.println("有新的群注册成功,群名称为"+
groupName+",一共有"+groups.size() + "个群");
}else if (msgFromClient.getType().equals("4")) {
// 群聊信息
System.out.println("服务器收到的群聊信息为:"+msgFromClient);
String groupName = msgFromClient.getTo();
Set<String> names = groups.get(groupName);
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String socketName = iterator.next();
Socket client = clients.get(socketName);
try {
PrintStream out = new PrintStream(client.getOutputStream(),
true,"UTF-8");
MessageVO messageVO = new MessageVO();
messageVO.setType("4");
messageVO.setContent(msgFromClient.getContent());
// 群名-[]
messageVO.setTo(groupName+"-"+CommUtils.object2Json(names));
out.println(CommUtils.object2Json(messageVO));
System.out.println("服务端发送的群聊信息为:"<