2017-03-01 43 views
0

我试图实现一个客户端 - 服务器应用程序,其中服务器可以接受来自客户端的一些对象,并且对于每个对象,它必须将其解释为消息并且妥善处理。套接字服务器在同一个进程中一次只接受一个连接

下面是代码:

(服务器)

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的实例吃了机器,并在另一台机器上连接到服务器,并顺序发送两条消息。问题在于服务器只接收并处理第一条消息,第二条消息丢失,客户端没有服务器接收到第二条消息。奇怪的是,如果我将这两个messagens作为两个不同的aplications发送,服务器就可以很好地处理它。这与在同一过程中发送的两条消息有关吗?

代码工作作为diferent aplications:

(消息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(); 
     } 
    } 
    } 
+0

尝试写他们通过os.flush到的ObjectOutputStream() – Sanjeev

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

希望这有助于

+1

谢谢,工作第二。只要在你提到的这个部分放上一个无限循环,每件事情都可以正常工作 –

相关问题