2017-11-27 9 views
0

私はJavaのソケットの横にスレッドを使用する方法を学ぼうとしています。私はとてもシンプルなプログラムを持っています。その機能は、ユーザに文字列を入力させ、そのメッセージがソケット内でスレッドの中で実行されているサーバによって受信され、出力されるようにすることです。私はそれを印刷するために "Connection established!"ユーザーからの入力を受け入れることはできますが、決して印刷されていないようです。受信したメッセージがコンソールに印刷されない理由がありますか?ここでシンプルなJavaソケットとスレッドプログラムのトラブル

は、Clientクラスである:

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.Scanner; 

public class Client { 
    public static void main(String[] args) throws IOException { 
     InetAddress host = InetAddress.getLocalHost(); 

     TCPServer newServer = new TCPServer(5001); 
     Thread thread = new Thread(newServer); 
     thread.start(); 

     Socket socket = new Socket(host,5001); 
     String outgoing_message = ""; 
     Scanner scan = new Scanner(System.in); 
     PrintWriter printer = new PrintWriter(socket.getOutputStream()); 
     while(!outgoing_message.equals("close")) { 
      System.out.print("Enter message: "); 
      outgoing_message = scan.nextLine(); 
      printer.println(outgoing_message); 
     } 
     socket.close(); 


    } 
} 

そして、ここではTCPServerのクラスです:

package Package_Two; 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 

public class TCPServer implements Runnable{ 
    private Socket socket; 
    private ServerSocket serverSocket; 



    public TCPServer(int port) throws IOException{ 
     this.serverSocket = new ServerSocket(port); 
    } 

    @Override 
    public void run(){ 
     try { 
      this.socket = serverSocket.accept(); 
      System.out.println("Connection established!"); 
      Scanner scan = new Scanner(socket.getInputStream()); 
      String incoming_message = ""; 
      while(!incoming_message.equals("close")){ 
       incoming_message = scan.nextLine(); 
       System.out.println("Received message: " + incoming_message); 
      } 
      socket.close(); 
     } 
     catch(IOException iex){ 
      iex.printStackTrace(); 
     } 


    } 




} 

答えて

1

あなたが使用PrintWriterコンストラクタのソースコードを見てみましょう場合、あなたはそれを発見しますそれはautoFlush = falseで別のコンストラクタを呼び出します。

私が思う、あなたがそれを変更する必要があります。

PrintWriter printer = new PrintWriter(socket.getOutputStream(), true); 
+1

ああ、まあそれは私のPrintWriterクラスの誤解とどのようにのPrintWriterが働いたのではなく、私は完全にスレッドを使用していたという事実だったことを知ることが慰めです違う。 – JLH

関連する問題