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

时间:2014-05-14 21:46:00

标签: java multithreading tcp stream

我不确定这里发生了什么。 我有一个等待传入连接的TCP java服务器。

在我的TCP java客户端中,当我按下" connect"时,我试图这样做。我的GUI表单上的按钮(当在TCPClient.java中调用connect()时),它打开了一个到服务器的新套接字。

这样做,服务器正确显示当我按下" connect"在客户端。

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

我不希望我的程序在创建流时冻结,因为它无法达到我创建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{
            sInput = new ObjectInputStream(socket.getInputStream());
            sOutput = new ObjectOutputStream(socket.getOutputStream());
            }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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