我有一个客户端和一个服务器 . 客户端绑定特定端口上的套接字,服务器将新端口发送回客户端,客户端应绑定新端口号上的新套接字 .
从主服务器线程开始,我启动一个线程,在服务器准备就绪并且正在侦听新端口时向客户端发送消息,以便客户端可以尝试连接到新端口 . 来自子线程的管道不会将消息发送到客户端 . 所以客户端和服务器都冻结了,这似乎是一个僵局,但我不确定 . 客户端中的这行代码: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);
}
}
1 回答
客户端中的
readLine()
是阻塞调用,等待行尾字符http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()
你不是't sending an end of line character. You'在服务器中使用
DataOutputStream
并发送原始字节 .不要在服务器中使用
DataOutputStream
;我真的不知道你在寻找什么 . 只需将端口号作为带有行尾字符的文本发送即可 .