2016-05-05 15 views
0

私は、クライアントとサーバーの間で位置データを送信し、ソケットの仕組みを学ぶ少しのゲームに取り組んでいます。ソケットを介して同時にデータを送受信します。

サーバーはデータの送受信に問題はなく、クライアントはデータを送信できますが、クライアントがサーバーからデータを読み込もうとするとプログラムがハングします。

public void run() { 

    try { 
     serverSocket = new ServerSocket(10007); 
    } catch (IOException e) { 
     System.err.println("Could not listen on port: 10007."); 
     System.exit(1); 
    } 

    try { 
     System.out.println("Waiting for connection..."); 
     clientSocket = serverSocket.accept(); 
    } catch (IOException e) { 
     System.err.println("Accept failed."); 
     System.exit(1); 
    } 
    System.out.println("Connection successful"); 
    System.out.println("Waiting for input....."); 
    while (true) { 
     try { 
      in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      out = new PrintWriter(clientSocket.getOutputStream(), true); 
      if (in.readLine() != "0" && in.readLine() != null) { 
       setXY(in.readLine()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } 
     out.println("X" + Graphics.charX); 
     out.println("Y" + Graphics.charY); 
    } 

クライアントコード::すべてのヘルプははるかに高く評価されて

public void run() { 

    try { 
     System.out.println("Attemping to connect to host " + serverHostname + " on port " + serverPort + "."); 
     echoSocket = new Socket(serverHostname, serverPort); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host: " + serverHostname); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for " + "the connection to: " + serverHostname); 
     System.exit(1); 
    } 
    while (true) { 

     try { 
      in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); 
      out = new PrintWriter(echoSocket.getOutputStream(), true); 
      /*if (in.readLine() != "0" && in.readLine() != null) { 
       setXY(in.readLine()); 
      }*/ 
     } catch (IOException e2) { 
      e2.printStackTrace(); 
     } 
     out.println("X" + Graphics.charX); 
     out.println("Y" + Graphics.charY); 

    } 

} 

サーバコード(この部分はコメントアウトされて)!

+0

ここにスレッドを行っていますか? –

+0

はい、このクラスは1つのスレッドです。 –

+0

さて、あなたは正しくスレッド化しているわけではなく、スレッドでこれを行う方法を調べたいと思うでしょう。この種の質問はかなり尋ねられているので、ちょっとした検索をしてください。そうすればあなたには報われるでしょう。 –

答えて

0

ブロッキングソケットを同時に読み書きするには、2つのスレッドが必要です(これは実行しようとしています)。 in.readLine()を呼び出すと、現在のスレッドはデータ行を受信するまでブロックされます。

関連する問題