我有一个客户端和一个服务器。客户端在特定端口上绑定(bind)一个套接字,服务器向客户端发回一个新端口,客户端应在新端口号上绑定(bind)一个新套接字。
从主服务器线程中,我启动一个线程,一旦服务器准备好并正在监听新端口,该线程就会向客户端发送消息,以便客户端可以尝试连接到新端口。子线程的管道未将消息发送到客户端。 所以客户端和服务器都卡住了,这似乎是一个僵局,但我不确定。这行代码在客户端:System.out.println("FROM SERVER: "+ inMsg_rport);没有执行。
服务器代码:
class server
{
public static void main(String argv[]) throws Exception
{
String newPort;
ServerSocket serverSocket = null;
Socket clientSocket = null;
try
{
serverSocket = new ServerSocket(5555);
clientSocket = serverSocket.accept();
DataOutputStream serverOut =
new DataOutputStream(clientSocket.getOutputStream());
int r_port = 5556;
Thread appThread = new Thread(new serverApp(serverOut, r_port));
appThread.start();
}
catch(IOException e)
{
System.out.println(e);
}
}
static class serverApp implements Runnable
{
DataOutputStream serverOut;
int nPort;
public serverApp(DataOutputStream servO, int r_port)
{
this.serverOut = servO;
this.nPort = r_port;
}
@Override
public void run()
{
ServerSocket serverSocket = null;
Socket clientSocket = null;
try
{
serverSocket = new ServerSocket(nPort);
serverOut.writeBytes(sr_port);
clientSocket = serverSocket.accept();
}
catch(IOException e)
{
System.out.println(e);
}
}
}
}
客户端代码:
class client {
public static void main(String argv[]) throws Exception
{
String serverIp = argv[0];
String msg = argv[2];
int port = Integer.parseInt(argv[1]);
Socket clientSocket = new Socket(InetAddress.getByName(serverIp), port);
BufferedReader clientIn =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
String inMsg_rport = clientIn.readLine();
System.out.println("FROM SERVER: " + inMsg_rport);
int r_port = Integer.parseInt(inMsg_rport);
clientSocket.close();
System.out.println("Closed connection");
Socket new_clientSocket = new Socket(InetAddress.getByName(serverIp), r_port);
}
}
最佳答案
客户端中的
readLine()
是一个阻塞调用,等待行尾字符
http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine ()
您没有发送行尾字符。您在服务器中使用 DataOutputStream
并发送原始字节。
不要在服务器中使用DataOutputStream
;我认为这并不是您真正想要的。只需将端口号作为带有行尾字符的文本发送即可。
关于Java 客户端-服务器应用程序管道无法在子线程上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904336/