Java TCP Client在创建输出/输入流时冻结



我不知道这是怎么回事。我有一个TCP java服务器,等待传入的连接。

在我的TCP java客户端,我试图使它,所以当我按下"连接"按钮在我的GUI表单,(当连接()在TCPClient.java中调用),它打开一个新的套接字到服务器。

当我在客户端按下"连接"时,服务器正确地显示一个新玩家加入。

现在我需要客户端能够有一个输入流和输出流来发送/接收数据。我将在一个单独的线程上执行此操作。但是,当我创建这两个流时,程序完全冻结了。

我不希望我的程序在我创建流时冻结,因为这样它就不能到达我创建ListenFromServer线程的点:

    package client;
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;

    public class TCPClient extends Thread {
        UIClient ui;
        public boolean connected = false;
        Socket socket;
        ObjectInputStream sInput;       // to read from the socket
        ObjectOutputStream sOutput;     // to write on the socket

        public TCPClient(UIClient ui) throws UnknownHostException, IOException{
            this.ui = ui;
            System.out.println("client start");
            ui.console.println("CLIENT TEST");
        }
        public void connect() throws UnknownHostException, IOException{
            try{
                socket = new Socket("localhost", 2232);
            }
            catch(Exception e){
                ui.console.println("Could not connect to server");
                return;
            }
            try{
            sInput = new ObjectInputStream(socket.getInputStream());
            sOutput = new ObjectOutputStream(socket.getOutputStream());
            }
            catch (IOException ioE){
                ui.console.println("Exception creating new input/output streams");
                return;
            }
            //Thread that listens for messages from the server
            new ListenFromServer(this).start();
        }
    }

在try语句处冻结:

                try{
            sInput = new ObjectInputStream(socket.getInputStream());
            sOutput = new ObjectOutputStream(socket.getOutputStream());
            }

ObjectIputStream将在构建时尝试从input stream读取数据。由于输入流是blocking,程序将等待,直到有东西要读。

要解决这个问题,需要在套接字服务器端点上打开ObjectOutputStream

Socket socket = ss.accept(); // ss is the ServerSocket
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());

在线程的run()方法中创建流,而不是在事件线程中可能运行的connect()方法中创建流。创建对象流需要I/O。然后先创建ObjectOutputStream

最新更新