Java中的套接字-如何将DataOutputStream写入特定客户端?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (123)

这是我来自服务器的一段代码。

静态变量(我使用Swing作为GUI):

static DataOutputStream dos;
static DataInputStream dis;
static Vector<ClientHandler> ar = new Vector<>(); // Vector for active clients
static int i = 0; // Client counter

连接解决的主要方法中的部分:

ServerSocket ss = new ServerSocket(1234);
Socket s;

while (true) {
    s = ss.accept();    
    dis = new DataInputStream(s.getInputStream());
    dos = new DataOutputStream(s.getOutputStream());

    ClientHandler mtch = new ClientHandler(s, "Client" + (i+1), dis, dos);
    Thread t = new Thread(mtch);
    ar.add(mtch); // Add client to active clients
    t.start();
    i++;
}

我已经创建了一个发送消息的方法(当我单击一个按钮时):

public void send() {
try {
    String msgout = "";
    msgout = txtChat.getText().trim();
    if (!msgout.equals("")) {
        dos.writeUTF(msgout); // Need to get specific here. How to write to Client's 1 DataInputStream?
    }
} catch (Exception e) {
       //
  }
}  

这里可以找到ClientHandler类。https:/pastebin.com/NWms7TfF

提问于
用户回答回答于

这是不好的:

static DataOutputStream dos;

其次是:

dos.writeUTF(msgout);

你正在创建一个静态DataOutputStream字段,然后想知道为什么使用该字段只表示一个输出流。首先,你应该摆脱静态字段,尽管这不会解决你的问题(但它可能有助于解决其他问题)。相反,如果你想要写入特定的输出流,则需要一种方法来获得对它的引用。考虑创建一个HashMap来保存ClientHandler对象,并使用你希望使用的唯一标识符将它们添加到Map中,这些标识符可能是clientName字符串字段或clientId字符串字段(不对id使用数字)。

扫码关注云+社区

领取腾讯云代金券