我不确定这里发生了什么。 我有一个等待传入连接的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());
}
答案 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());