我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为ClientThread的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的ClientThread实例,并将所有这些实例存储在列表中。现在我想实现一个私人聊天,这样每个客户端就可以私下与另一个客户端交谈(或者2,3或更多的群聊)。
我还想说一个事实,我只通过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;
}
}
现在是我的第二个问题:
对于您的第一个问题,看看这个,您可以创建一个类似的表,如此处指定的数据库设计,用于存储人与人之间的聊天消息
要发送文件,您可以将它们转换为字节并按如下方式发送:-
public byte[] read() throws IOException
{
int length = inputStream.readInt();
byte[] dataBytes = new byte[length];
inputStream.readFully(dataBytes, 0, dataBytes.length);
return dataBytes;
}
public void write(byte[] data, Short packetType) throws IOException
{
outputStream.writeShort(packetType);
outputStream.writeInt(data.length);
outputStream.write(data);
outputStream.flush();
}
要将文件转换为字节:-
Path path= Paths.get("file/path");
byte[] data = Files.readAllBytes(path);
要将字节转换回文件 :-
byte[] data = read();
Path path = Paths.get("C:\myfile.FileType");
Files.write(path, bytes);
发送文件名及其扩展名,然后发送文件,这样您可以在另一端重新创建它。
我还编写了一个简单的聊天程序,并创建了一个“用户”类,将消息列表作为一个字段。每条消息都是一个带有“发件人”、“收件人”等和文本的对象。可以为每个用户单独迭代消息列表
问题内容: 我正在构建一个小型聊天应用程序,其中客户端A希望通过服务器B将某些东西发送到客户端C。首先,这是解决问题的正确方法吗?我能够向服务器发送数据或从服务器接收数据,但仅限于客户端。例如,如果客户端A向服务器B发送数据而客户端C向服务器B发送数据,则我可以将数据发送回服务器A和C就像回显服务器一样。但是我想要的是将来自客户端A的数据通过服务器B转发到客户端C。 以下是服务器代码: 客户端代码
我对套接字有点陌生,我正在尝试编写一个程序,在这个程序中,我基本上可以从客户端程序向服务器程序发送一些简单的请求。现在我只想在客户端有1或2个选项供用户选择。例如,如果用户在客户端选择“选项1”,那么服务器会返回一条消息“您选择选项1”,以此类推,但我不知道如何读取服务器上从客户端发送的输入。 客户代码: 服务器代码: 我需要在Clinet中使用两个不同的BufferedReader吗?一个用于用
问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我
我正在尝试连接一个带有gui的客户端和一个没有gui的服务器。连接正在进行中,但我看不到这两个应用程序之间的任何消息。(我应该将服务器放在客户端中,而将客户端放在服务器中) 客户端连接代码: PS:我也在服务器中尝试了PrintWriter,也尝试了try catch in stream语句,问题仍然存在。
正在编写一个服务器,使用Java套接字的客户端聊天程序。这是我的服务器套接字类的代码。 客户端能够建立连接并向服务器发送消息。服务器也可以接收客户端发送的消息。问题是当消息从服务器发送时,客户端没有收到消息。这是我的客户端套接字代码。
我有这个代码可以在eclipse中与android Studio中的客户端通信服务器,我使用套接字,客户端向服务器发送消息,服务器读取该消息并确定一切正常,但当服务器向客户端发送消息时,客户端不强制任何东西;这是代码 还有这个 此代码是服务器代码的一部分,如果您需要客户端代码(Android Studio),请告诉我。 我需要帮助拜托