2012-04-05 18 views
1

サーバーは、クライアントに「Hello :: enter QUIT」というメッセージを送信してから、クライアントが任意のテキストを入力し、クライアントのテキストに「From server:」を追加してエコーバックします。メッセージ。 しかし、秩序の中に混在しているようで、私はどこを見つけることができない!私はこの一日中終わりました!クライアントとサーバー間のTCP通信

これは、サーバーのコードです:私は、私はそうした後、それをテストしてい

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class Client { 
    // @SuppressWarnings("deprecation") 
    public static void main(String args[]) { 
     Scanner scanner = new Scanner(System.in); 
     try { 
      Socket s = new Socket("localhost", 8080); 
      PrintWriter outp = new PrintWriter(s.getOutputStream(), true); 
      BufferedReader inp = new BufferedReader(new InputStreamReader(
        s.getInputStream())); 
      boolean more_data = true; 
      System.out.println("Established connection"); 
      String line; 
      while (more_data) { 
       line = inp.readLine(); 
       String userInput = scanner.nextLine(); 
       outp.println(userInput); 
       if (line == null) { 
        more_data = false; 
       } else 
        System.out.println(line); 
      } 
      System.out.println("end of while"); 
     } catch (Exception e) { 
      System.out.println("IO error " + e); 
     } 
    } 
} 

import java.net.*; 


public class Server { 

    public static void main(String[] args) { 

     int nreq = 1; 
     try 
     { 
      ServerSocket sock = new ServerSocket (8080); 
      for (;;) 
      { 
       Socket newsock = sock.accept(); 
       System.out.println("Creating thread ..."); 
       Thread t = new ThreadHandler(newsock,nreq); 
       t.start(); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println("IO error " + e); 
     } 
     System.out.println("End!"); 
    } 
} 

ThreadHandlerコード:

import java.io.*; 
import java.net.*; 

class ThreadHandler extends Thread { 
    Socket newsock; 
    int n; 

    ThreadHandler(Socket s, int v) { 
     newsock = s; 
     n = v; 
    } 

    // @SuppressWarnings("deprecation") 
    public void run() { 
     try { 

      PrintWriter outp = new PrintWriter(newsock.getOutputStream(), true); 
      BufferedReader inp = new BufferedReader(new InputStreamReader(
        newsock.getInputStream())); 
      outp.println("Hello :: enter QUIT to exit"); 
      boolean more_data = true; 
      String line; 
      while (more_data) { 
       line = inp.readLine(); 
       if (line == null) { 
        more_data = false; 
       } else { 
        outp.println("From server: " + line + "\n"); 
        if (line.trim().equals("QUIT")) 
         more_data = false; 
       } 
      } 
      newsock.close(); 
     } catch (Exception e) { 
      System.out.println("IO error " + e); 
     } 

    } 
} 

およびクライアント・コードクライアントをAndroidの携帯電話にする - 可能ならば -


更新:ルイス・ミゲル・セラーノが提案し、クライアントのを変更するよう

outp.println("Hello :: enter QUIT to exit \n"); 
     boolean more_data = true; 
     String line; 
     while (more_data) { 
     line = inp.readLine(); 
     System.out.println("Message '" + line + "' echoed back to client.");// !! 
     if (line == null) { 
      System.out.println("line = null"); 
      more_data = false; 
     } else { 
      outp.println("From server: " + line + ". \n"); 
      if (line.trim().equals("QUIT")) 
       more_data = false; 
     } 
    } 
    newsock.close(); 
    System.out.println("Disconnected from client number: " + n); 

とHelloメッセージの最後に「\ n」を追加しました:

私は、サーバーのコードを変更しました

boolean more_data = true; 
     System.out.println("Established connection"); 
     String line;// = inp.readLine(); 

     while (more_data) { 
      line = inp.readLine(); 
      System.out.println(line); 
      if (line == null) { 
       // nothing read 
       more_data = false; 
      } else 
       line = inp.readLine(); 
      System.out.println(line); 
      String userInput = scanner.nextLine(); 
      if (userInput.trim() == "QUIT") { 
       s.close(); 
       System.out.println("Disconnected from server."); 
       more_data = false; 
      } else 
       outp.println(userInput); 

     } 
     System.out.println("end of while"); 

これで正常に動作します。

誰かが私にいくつかのAndroidクライアント/ Javaサーバチュートリアルを教えていただければ幸いです。

+0

あなたはどのような行動をしていますか?どのエラー(もしあれば)? –

+0

エラーはありませんが、メッセージの順序は混在しています。サーバーは "Hello :: ....."を送信する必要があります。次に、クライアントがメッセージを入力して、サーバーがエコーするようにします。しかし、クライアントがメッセージを入力するのを待ってから、それは "Hello :: ...."メッセージを送信します –

答えて

1

コメントの順番で、それはフラッシュの問題かもしれません。あなたがストリームに書き込むときに、時にはあなたが書いたものがバッファに保持され、

outp.println("Hello :: enter QUIT to exit"); 

:後

outp.flush(); 

:次の行を追加してみてください。バッファが空になり、実際に文字列が送信されるようにするには、flush()メソッドを呼び出す必要があります。また

アップデートは、サーバーからあなたのHelloウェルカムメッセージの最後に「\ n」を追加します。私はそれがうまくいくと思う。

+0

これは同じことをやっています!なぜサーバーのメッセージがクライアントに送信されないのか分かりません。 - どうもありがとうございます。 –

+0

Hello文字列の最後に "\ n"を追加してください。私はそれが賭ける。ちょうど私に起こった:) –

+0

ありがとうルイス。それが助け:)今うまく動作します。 –

関連する問題