gpt4 book ai didi

java - Socket 服务器在同一进程上一次仅接受一个连接

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

我正在尝试实现一个客户端-服务器应用程序,其中服务器可以接受来自客户端的一些对象,并且对于每个对象,它必须将其解释为消息并正确处理它。

这是代码:

(服务器)

public class GlobalServer{
GlobalServer(){new Thread(() ->{
try {
serverSocket = new ServerSocket(1234);
Socket clientSocket;
while (true) {
clientSocket = serverSocket.accept();
handleClient(clientSocket);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}).start();
}

public void handleClient(Socket clientSocket) throws IOException, ClassNotFoundException{
ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream());
Object [] objArr = (Object[]) is.readObject();
msgHandler(objArr, clientSocket);
}

public void msgHandler(Object [] objArr, Socket clientSocket){
int msg_type = (int) objArr[0];
switch (msg_type) {
case 1:
System.out.println("type 1 received");
break;
case 2:
System.out.println("type 2 received");
break;
case 3:
System.out.println("type 3 received");
break;

default:
break;
}
}
public static void main(String [] args){
GlobalServer s = new GlobalServer();
}
}

OBS:在应用程序上,接收对象数组是有意义的,因为每条消息都带有其 header (类型)和内容

(客户端)

public class Client {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);

ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
Object [] objArr = {3, "Type 3 message"};
os.writeObject(objArr);

Object []objArr1 = {1, "Type 1 message"};
os.writeObject(objArr1);
} catch (IOException e) {
e.printStackTrace();
}
}
}

我在一台单独的计算机上运行 GlobalServer 的实例,并在另一台计算机上连接到服务器并按顺序发送两条消息。问题是服务器仅接收和处理第一条消息,而第二条消息会丢失,并且客户端在服务器未收到第二条消息的情况下完成。奇怪的是,如果我将这两个消息作为两个不同的应用程序发送,服务器可以很好地处理它。它与在同一进程上发送的两个消息有关吗?

代码作为不同的应用程序工作:

(消息 1)

public class Message1 {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);

ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());

Object [] objArr = {3, "Type 3 message"};
os.writeObject(objArr);

} catch (IOException e) {
e.printStackTrace();
}
}
}

(消息2)

public class Message2 {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);

ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());

Object []objArr1 = {1, "Type 1 message"};
os.writeObject(objArr1);
} catch (IOException e) {
e.printStackTrace();
}
}
}

最佳答案

问题出在以下代码块中:

public void handleClient(Socket clientSocket) throws IOException, ClassNotFoundException{
ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream());
Object [] objArr = (Object[]) is.readObject();
msgHandler(objArr, clientSocket);
}

您只读取一个对象。 (Object[]) is.readObject(); 应在循环中调用,以便读取多个对象并为每个对象调用 msgHandler 方法。

希望这有帮助

关于java - Socket 服务器在同一进程上一次仅接受一个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535941/

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