2012-10-15 52 views
0

工作,我有一個客戶端和服務器。客戶端綁定特定端口上的套接字,服務器向客戶端發回一個新端口,客戶端應在新端口號上綁定一個新套接字。Java客戶端 - 服務器應用程序管不上孩子線程

從主服務器線程,從我做起一旦服務器已準備就緒,並聽取了新的端口,這樣客戶端可以嘗試連接到新的端口將消息發送到客戶端一個線程。來自子線程的管道不會將消息發送給客戶端。 因此,客戶端和服務器都凍結,似乎是一個僵局,但我不知道。客戶端中的這一行代碼: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); 

       } 
      } 
+0

「客戶端綁定特定端口上的套接字,服務器發回一個新的端口,客戶端和客戶端應該綁定在新的端口號,一個新的socket。」爲什麼?爲什麼客戶端「綁定一個特定的端口」,如果它不是服務器?爲什麼客戶端需要綁定到第二個端口?還是第一個端口?服務器如何知道客戶端有哪些端口是免費的? – EJP

回答

0

readLine()在您的客戶端是一個阻塞調用,等待結束行的字符

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

您沒有發送行字符的結尾。您在服務器中使用DataOutputStream併發送原始字節。

不要使用你的服務器DataOutputStream;我不認爲這真的是你要找的。只需將端口號作爲文本發送到行尾字符並完成。

+0

我怎麼能「只需發送的端口號爲文本與行字符的結尾,並用它做」?謝謝! –

+0

就像你在你的客戶端做的事情,但與輸出的同行。而不是使用'DataOutputStream'使用'OutputStreamWriter'。如果你願意的話,你也可以把它包裝在一個'BufferedWriter'中。 –

相關問題