クライアントとサーバーがあります。クライアントは特定のポートでソケットをバインドし、サーバーは新しいポートをクライアントに送り返し、クライアントは新しいポート番号で新しいソケットをバインドする必要があります。
メイン サーバー スレッドから、サーバーの準備ができて新しいポートをリッスンしているときにクライアントにメッセージを送信するスレッドを開始し、クライアントが新しいポートへの接続を試行できるようにします。子スレッドからのパイプがメッセージをクライアントに送信していません。したがって、クライアントとサーバーの両方がフリーズするだけで、デッドロックのように見えますが、よくわかりません。クライアントのこのコード行: 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);
}
}