0

让我直接跳到这里是我的服务器类:应用程序试图通过一个套接字发送对象时冻结

public class DTServer { 

ServerSocket serverSocket; 
ServerSocketHints serverSocketHints; 
Socket socket; 
InputStream inputStream; 
OutputStream outputStream; 
ObjectInputStream objectInputStream; 
ObjectOutputStream objectOutputStream; 

public DTServer(int port) { 
    serverSocketHints = new ServerSocketHints(); 
    serverSocketHints.acceptTimeout = 0; 

     serverSocket = Gdx.net.newServerSocket(
       Net.Protocol.TCP, port, serverSocketHints); 

    socket = serverSocket.accept(null); 
} 

public Serialized receiveSerialized() { 
    inputStream = socket.getInputStream(); 
    try { 
     objectInputStream = new ObjectInputStream(inputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    outputStream = socket.getOutputStream(); 
    try { 
     objectOutputStream = new ObjectOutputStream(outputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Serialized serialized = new Serialized(); 
    try { 
     serialized = (Serialized) objectInputStream.readObject(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return serialized; 
} 
} 

和客户端类:

public class DTClient { 

Socket socket; 
SocketHints socketHints; 
InputStream inputStream; 
OutputStream outputStream; 
ObjectInputStream objectInputStream; 
ObjectOutputStream objectOutputStream; 

public DTClient(String address, int port) { 
    socketHints = new SocketHints(); 
    socketHints.connectTimeout = 3000; 
    socketHints.keepAlive = true; 
//  socketHints.trafficClass = 0x04; //IPTOS_RELIABILITY 

    socket = Gdx.net.newClientSocket(
      Net.Protocol.TCP, address, port, socketHints); 
} 

public void sendSerialized(Serialized serialized) { 
    inputStream = socket.getInputStream(); 
    try { 
     objectInputStream = new ObjectInputStream(inputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    outputStream = socket.getOutputStream(); 
    try { 
     objectOutputStream = new ObjectOutputStream(outputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     objectOutputStream.writeObject(serialized); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

我创建服务器对象像这样的:

public void startServer() { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      dtServer = new DTServer(32658); 
      System.out.println("Server started and listening at port: 32658."); 
     } 
    }).start(); 
} 

,然后连接到它与程序的其他实例:

public void connect() { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      dtClient = new DTClient("127.0.0.1", 32658); 
      System.out.println("Connected to server at 127.0.0.1:32658"); 

     } 
    }).start(); 
} 

而且一切工作,直到膨胀我尝试收到我送的对象:

game.dtClient.sendSerialized(new Serialized(game.gameScreen.localPlayer)); 
//client side 

Serialized s = (Serialized)game.dtServer.receiveSerialized(); 
//server side 

调用receiveSerialized方法导致两个应用实例冻结。

回答

0

ObjectInputStream,两端创建ObjectOutputStream。否则,您可能会遇到尝试读取对象流头的死锁。

您还应该在套接字的生命周期中使用相同的对象流,而不是每个消息都有一对新对。

相关问题