2017-03-20 4 views
0

グーグルで時間を費やし、可能な限りすべての手段を試してみたら、なぜ私のコードが機能していないのかを少し説明することにしました。これは私が達成したいものです::Javaクライアントに関する問題<-->サーバソケット

クライアントとサーバーのソケットがあります。クライアントソケットは、サーバーにメッセージを送信します(例えば、"add:2:3" to add 2 and 3など)。サーバーは応答で応答する必要があります。応答が到着すると、クライアントは"subtract:5:8" to subtract 5 from 8のような追加のメッセージを送信することができます。したがって、クライアントはメッセージを送信し、応答を取得し、次のメッセージを送信して応答を取得します。コマンドラインからメッセージを送信しています。

これは私が今持っているものですが、それは::私が読んするために、2つのスレッドを使用することを決定し、クライアントのために

// Serverコード

public class MT extends Thread{ 

    private Socket sock; 
    private BufferedReader rd; 
    private OutputStreamWriter wr; 

    private Client client; 

    public MT(Socket sock) throws IOException { 
     this.sock= sock; 
     rd = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
     wr = new OutputStreamWriter(sock.getOutputStream()); 
     wr.write("You are welcome" + "\n"); 
     wr.flush(); 
    } 

    public void run(){ 
     try{ 
      while(true){ 
       String command = reader.readLine(); 
       // Will process data here and then send results to client 
       // At the moment i just want to send the message back to client 
       wr.write(command + "\n"); // send results to client 
        } 
       } 
      } 
     }catch(IOException ex){ 
      System.err.println("Problem reading data from client"); 
     } 
    } 

} 


public class MyServio { 

    public static void main(String[] args) { 

     try(ServerSocket server = new ServerSocket()){ 

      server.bind(new InetSocketAddress("0.0.0.0", 4444)); 
      System.out.println("Listening..."); 

       try{ 
        while(true){ 
        Socket con = server.accept(); 

        Thread a = new MT(con); 
        a.start(); 
       } 
       }catch(IOException ex){ 
        System.err.println("Problem..."); 
       } 

     }catch(IOException ex){ 
      System.err.println("Server Issues"); 
     } 
    } 

} 

//クライアント

が動作していませんサーバーに書き込みます。

public class MyRead extends Thread{ 

    private BufferedReader r; 

    public ReadFromServer(BufferedReader r){ 

      this.r = r; 
    } 

    @Override 
    public void run() { 
      StringBuilder m = new StringBuilder(); 
      try { 
       while(true){ 
        message.append(r.readLine()); 
        System.out.println(m); 
       } 
      } catch (IOException e) { 
       System.out.println("Problem in MyRead"); 
       e.printStackTrace(); 
      } 


    } 

} 




public class MyWrite extends Thread{ 

    private OutputStreamWriter w; 
    Scanner sc; 

    public WriteToServer(OutputStreamWriter w){ 
      this.w = w; 
      sc = new Scanner(System.in); 
    } 

    @Override 
    public void run() { 

     try { 
      while(true){ 
       System.out.print("Type message: "); 
       String msg = sc.nextLine(); 
       w.write(msg + "\n"); 
       w.flush(); 
     } 
     } catch (IOException e) { 
      System.out.println("Problem in MyWrite"); 
      e.printStackTrace(); 
     } 

    } 
} 




public class CSock { 

    private OutputStreamWriter w; 
    private BufferedReader r; 

    public ClientSocket() {} 

    public void do(){ 

     InetAddress ad = null; 
     try { 
      ad = InetAddress.getByName("127.0.0.1"); 
     } catch (UnknownHostException e) { 
      System.err.println("Error InetAddress"); 
     } 
     try (Socket s = new Socket(addr, PORT)) { 

      System.out.println("Server connecting..."); 


      StringBuilder message = new StringBuilder(); 

      r = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      w = new OutputStreamWriter(s.getOutputStream()); 

      message.append(r.readLine()); // reads the welcome message from server 
      System.out.println(message); 

      // I start the read and write threads so that the client can read and write message to the server 
      ReadFromServer rd = new ReadFromServer(r); 
      WriteToServer wt = new WriteToServer(w); 
      rd.start(); 
      wt.start(); 
     } catch (IOException ex) { 
      System.err.println("problem connecting to server"); 
     } 
    } 

} 




public class Main { 

    public static void main(String[] args){ 

     ClientSocket clientSocket = new ClientSocket(); 
     clientSocket.do(); 

    } 

} 

私はサーバーを最初に起動してからクライアントを起動しますが、クライアントは、例外を与える:::

Problem in MyRead 
java.net.SocketException: socket closed 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
    at java.net.SocketInputStream.read(SocketInputStream.java:170) 
    at java.net.SocketInputStream.read(SocketInputStream.java:141) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
    at java.io.InputStreamReader.read(InputStreamReader.java:184) 
    at java.io.BufferedReader.fill(BufferedReader.java:161) 
    at java.io.BufferedReader.readLine(BufferedReader.java:324) 
    at java.io.BufferedReader.readLine(BufferedReader.java:389) 
    at model.ReadFromServer.run(ReadFromServer.java:31) 

例外の最後の行は、コード内のmessage.append(reader.readLine());が問題であることを示しています。私はコードをどこでもソケットや入力ストリームや出力ストリームを閉じることはありませんが、この例外が発生します。

また、任意の助けが

おかげ

UPDATEを理解されるであろう::

writer.flush();

次の行でrun()方法でMyWriteクラスに似たsocket closed例外を取得例外の問題が解決/解決されました。もう一つの問題がある、あなたが私を助けることができるかもしれない。 "MyRead"スレッドが機能していません。コマンドラインでメッセージを入力してEnterキーを押すと、サーバーにデータが送信されますが、データはサーバーからクライアントに返されますが、MyReadはデータを読み取っていません。いつでも私はコマンドプロンプトでEnterキーを押すと、メッセージ "Type message:"が再び表示されます。私はサーバーからメッセージを取得しません。サーバーにメッセージを送信するたびに、結果をクライアントに送り返してから、別のメッセージを送信することができます。どんな助けもありがとう。ありがとう

答えて

0

ソケットを閉じてから使い続けました。 try-with-resourceステートメントはソケットを閉じました。開始した2つのスレッドは引き続きそのスレッドを使用します。このライン上のクライアントで

+0

あなたの答えに感謝します。 –

+0

私は投稿を更新しました –

1

try (Socket s = new Socket(addr, PORT)) { 

あなたはそれがtry文を実行した後、ソケットを閉じる必要があり、JVMを言っています。

この行は、ソケットの出力ストリームからリーダーを作成しています。

r = new BufferedReader(new InputStreamReader(s.getInputStream())); 

これは、サーバーから読み取る機能を作成しています。

ReadFromServer rd = new ReadFromServer(r); 

ReadFromServerはスレッドであり、try-catch文が終了した後は自由に実行できます。したがって、reader.readLine()を実行すると、ソケットは閉じられます。

+0

@roes投稿を更新しました –

+0

新しい質問を開きます – reos

関連する問題