【发布时间】:2016-08-03 12:32:39
【问题描述】:
我已经实现了一个通过套接字进行通信的全局聊天。客户端写入发送到服务器的消息,然后服务器将消息发送回所有客户端。每个客户端都由一个名为 ClientThread 的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的 ClientThread 实例并将所有这些实例存储在一个列表中。现在我想实现一个私人聊天,所以每个客户都可以与另一个客户私下交谈(或群聊,其中有 2,3 或更多)。
现在我的问题是我该怎么做。我的意思是我在想,每当一个客户端想要与另一个客户端开始私人对话时,将此请求发送到服务器,服务器会将这两个 ClientThread 实例存储在一个列表中,并且将是唯一一个会收到这些实例的人消息。第一个问题是如何存储这些对话。最好用什么?考虑到私人对话中可以有一个、两个或多个客户,并且一个客户可以有多个私人对话,我希望能够轻松识别消息的来源以及将其发回的位置。
我还想说一个事实,即我只通过 ChatMessage 类的实例进行通信,该类是我自己定义的,它有一个类型字段和一个消息字段。因此,每当一个用户向另一个用户发送私人消息时,服务器都会收到该类型为 PRIVATEMESSAGE 的消息,遍历所有存储的会话列表,并将消息发送到发送该请求的特定会话。
//output and input stream
output = new ObjectOutputStream(socket.getOutputStream());
input = new ObjectInputStream(socket.getInputStream());
// send messages
public void sendMessage(Object msg) {
try {
output.writeObject(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
public class ChatMessage implements Serializable {
protected static final long serialVersionUID = 1112122200L;
// The different types of message sent by the Client
// WHOISIN to receive the list of the users connected
// MESSAGE an ordinary message
// LOGOUT to disconnect from the Server
public static final int WHOISIN = 0;
public static final int MESSAGE = 1;
public static final int LOGOUT = 2;
public static final int LOGIN = 3;
public static final int PRIVATECONVERSATION = 4;
public static final int PRIVATEMESSAGE = 5;
private int type;
private String message;
// constructor
public ChatMessage(int type, String message) {
this.type = type;
this.message = message;
}
// getters
public int getType() {
return type;
}
public String getMessage() {
return message;
}
}
现在是我的第二个问题:
有没有办法通过这个 ChatMessage 类发送文件?我的意思是也许我可以有一个单独的字段,例如,每当我获得 FILE 类型时,我都会从该字段中读取字节?这可能吗?
【问题讨论】:
-
我建议实现房间的概念,即每个房间都是与多个成员对话的一个实例。看看一个叫做 SmartFoxServer 的东西——它是一个可以处理这个问题并使用自定义代码进行 Java 扩展的工具。可能不适合您正在寻找的东西/矫枉过正,但值得评论!
标签: java sockets chat sendfile