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

时间:2017-03-01 15:38:37

标签: java sockets networking tcp messaging

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

以下是代码:

(服务器)

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

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

(客户端)

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

我在一台单独的机器上运行GlobalServer实例,在另一台机器上运行我连接到服务器并按顺序发送两条消息。问题是服务器只接收和处理第一条消息而第二条消息丢失,客户端完成而服务器没有收到第二条消息。奇怪的是,如果我发送这两个消息作为两个不同的aplications,服务器处理它很好。它与在同一进程中发送的两条消息有关吗?

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

(消息1)

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

(消息2)

{{2}}

1 个答案:

答案 0 :(得分:1)

问题出在以下代码块中:

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方法。

希望这有帮助