1

クライアントとサーバーがあります。クライアントは特定のポートでソケットをバインドし、サーバーは新しいポートをクライアントに送り返し、クライアントは新しいポート番号で新しいソケットをバインドする必要があります。

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

                }
            }
4

1 に答える 1

1

readLine()あなたのクライアントでは、ブロッキングコールであり、行末文字を待っています

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine ()

行末文字を送信していません。サーバーでを使用し、DataOutputStream生のバイトを送信しています。

DataOutputStreamサーバーでa を使用しないでください。それは本当にあなたが探しているものではないと思います。ポート番号を行末文字付きのテキストとして送信するだけで完了です。

于 2012-10-15T21:39:14.880 に答える