【问题标题】:App freezes when trying to send an object via a socket尝试通过套接字发送对象时应用程序冻结
【发布时间】:2015-10-25 17:28:51
【问题描述】:

让我直接进入。这是我的服务器类:

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 方法会导致两个应用实例冻结。

【问题讨论】:

    标签: java sockets serialization objectinputstream objectoutputstream


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2019-04-21
      • 2014-01-11
      • 2022-01-15
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多