当前位置: 首页 > 知识库问答 >
问题:

使用套接字客户端-服务器-客户端通信实现聊天

庄元龙
2023-03-14

我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为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;
    }
}
 

现在是我的第二个问题:

共有2个答案

尉迟卓
2023-03-14

对于您的第一个问题,看看这个,您可以创建一个类似的表,如此处指定的数据库设计,用于存储人与人之间的聊天消息

要发送文件,您可以将它们转换为字节并按如下方式发送:-

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);

发送文件名及其扩展名,然后发送文件,这样您可以在另一端重新创建它。

年凯康
2023-03-14

我还编写了一个简单的聊天程序,并创建了一个“用户”类,将消息列表作为一个字段。每条消息都是一个带有“发件人”、“收件人”等和文本的对象。可以为每个用户单独迭代消息列表

 类似资料:
  • 问题内容: 我正在构建一个小型聊天应用程序,其中客户端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),请告诉我。 我需要帮助拜托