Java 套接字服务器在同一进程上一次只接受一个连接

Java 套接字服务器在同一进程上一次只接受一个连接,java,sockets,networking,tcp,messaging,Java,Sockets,Networking,Tcp,Messaging,我正在尝试实现一个客户机-服务器应用程序,在该应用程序中,服务器可以从客户机接收一些对象,对于每个对象,它必须将其解释为消息并正确处理 代码如下: 服务器 public class GlobalServer{ GlobalServer(){new Thread(() ->{ try { serverSocket = new ServerSocket(1234); Socket clientSocket; while (true) {

我正在尝试实现一个客户机-服务器应用程序,在该应用程序中,服务器可以从客户机接收一些对象,对于每个对象,它必须将其解释为消息并正确处理

代码如下:

服务器

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:在应用程序上,接收对象数组是有意义的,因为每条消息都带有其标题、类型和内容

客户

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);
}
你只在读一个物体。对象[]为.readObject;应在循环中调用,以便读取多个对象并为每个对象调用msgHandler方法


希望这有助于

在操作系统将对象写入ObjectOutputStream后尝试刷新对象。刷新相同的东西,处理第一个对象,然后在同一进程上忽略第二个。谢谢,这很有效。只要在你提到的这一部分上做一个无限循环,一切都很好