我不知道这是怎么回事。我有一个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