gpt4 book ai didi

java - 套接字问题 - 仅读取第一条消息

转载 作者:行者123 更新时间:2023-12-01 18:57:57 24 4
gpt4 key购买 nike

我对套接字非常陌生,希望有人能帮助我。我有一些工作,但它没有很快发送信息,所以我已经重构,现在无法返回任何工作。问题似乎是只读取发布的第一条消息,然后接收者位于 client = Listener.accept(); 即使我非常确定发送者仍在发送消息

任何人都可以看到我在这里可能做错了什么吗?

谢谢

  public class Sender {
Socket server = null;
DataInputStream inp = null;
PrintStream outp = null;

public Sender(){
server = new Socket("127.0.0.1" , 3456);
outp = new PrintStream(server.getOutputStream());
}

private void connectAndSendToServer(String message) {
outp = new PrintStream(server.getOutputStream());
outp.print(message + "\n");
outp.flush();

}
}

接收器类

public class Receive{


public String receiveMessage(int port) {
String message= null;
ServerSocket listener = null;
Socket client = null;
try{
listener = new ServerSocket(port);
client = listener.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
return br.readLine();

}
...
finally{
try {
if(client!=null && listener!=null){
client.close();
listener.close();
}
}
catch (IOException e) {

}
}
return message;
}
}

最佳答案

这是因为 ServerSocket 被用作普通 Socket 的入口点。 accept() 是一种阻塞操作,与向普通 Socket 接收/发送数据的线程相比,它通常在不同的线程上完成。它坐在那里等待新的连接来生成一个新的Socket,然后用于数据。

这意味着在接收消息时,您应该只调用 readLine() 来从特定的 Socket 读取消息。在 receiveMessage 中使用 accept 是错误的,因为它是不同的操作,甚至会阻塞。

Socket socket = serverSocket.accept();

ClientThread thread = new ClientThread(socket);

class ClientThread extends Thread {
Socket socket;

public void run() {
while (!closed) {
String line = reader.readLine();
...
}
}

虽然您不需要为每个客户端都有一个线程,但如果您想让服务器接受大于 1 的连接数,则至少需要两个线程。

关于java - 套接字问题 - 仅读取第一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com