2017-04-04 13 views
0

私はクイズのゲームの一部であるJava Webサーバーを作成しています。テスト目的のために、私はカウンターを含めました。サーバーには、スレッドを処理するFixedThreadPoolがあります。ThreadPoolでJava Webサーバーが応答していません

サーバーには、データベースからデータを収集するBufferedreaderと、出力をクライアントに書き込むために使用するPrintstreamがあります。さて、Printstreamの意図は、カウンターの結果をプリントアウトすることです。しかし、私はサーバーを実行すると何も起こらない、printStreamnは意図したように動作していません。端末に出力がなく、クライアントはサーバから何も受信していません。なにが問題ですか?

サーバー

import java.io.*; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 


public class QuizServer { 
private static final int serverPort = 9001; 
public static void main(String[] args) throws Exception { 

    ExecutorService theExecutor = Executors.newFixedThreadPool(4); 
    System.out.println("The chat server is running."); 
    ServerSocket quizSocket = new ServerSocket(serverPort); 

    while (true) { //Skriver ut While True 

     Socket connection = quizSocket.accept(); 
     theExecutor.execute(new Broadcaster(connection)); 
     } 
    } 
} 

class Broadcaster extends Thread { 
    private BufferedReader read; 
    private PrintStream write; 
    private Socket broadcastSocket; 

    static int counter = 0; 

    public Broadcaster(Socket broadcastSocket) throws IOException{ 
    read = new BufferedReader(new 
    InputStreamReader(broadcastSocket.getInputStream())); 
    write = new PrintStream(broadcastSocket.getOutputStream()); 

    } 
    @Override 
    public void run() { 
     while (true) { 

      try { 
       Thread.sleep(1000); 
       counter += 1; 

       write.println("Räknare: " + counter); 

      } catch (InterruptedException e) { 
       System.out.println("Sleep exception: " + e); 
      } 
     } 
    } 
} 

デバッグ

Connected to the target VM, address: '127.0.0.1:1925', transport: 'socket' 
The chat server is running. 
Exception in thread "main" java.net.BindException: Address already in use: 
JVM_Bind 
at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
at java.net.DualStackPlainSocketImpl.socketBind 
(DualStackPlainSocketImpl.java:106) 
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) 
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) 
at java.net.ServerSocket.bind(ServerSocket.java:375) 
at java.net.ServerSocket.<init>(ServerSocket.java:237) 
at java.net.ServerSocket.<init>(ServerSocket.java:128) 
at QuizServer.main(QuizServer.java:19) 
Disconnected from the target VM, address: '127.0.0.1:1925', transport: 
'socket' 

Process finished with exit code 1 

クライアント

public class Client implements Runnable { 

    @FXML 
    private Button bQuit = new Button(); 
    @FXML 
    private TextArea Out = new TextArea(); 
    @FXML 
    private TextField Input = new TextField(); 
    @FXML 
    private TextField IP = new TextField(); 
    @FXML 
    private TextField aliasField = new TextField(); 

    String alias; 

    String ServerAddress = "localhost"; 
    String userAnswer; 
    BufferedReader reader; 
    PrintWriter writer; 

    @FXML 
    public void initialize() { 
    bQuit.setOnAction(event -> Platform.exit()); 

    aliasField.setOnAction(a -> { 

     alias = aliasField.getText(); 

     Input.setOnAction(b -> { 
      userAnswer = Input.getText(); 
     }); 
    }); 
    aliasField.setPromptText("Alias"); 
    Input.setPromptText("And your answer is:"); 
      } 

     @Override 
public void run() { 

    try { 

     Socket clientSocket = new Socket(ServerAddress, 9001); 
     reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     writer = new PrintWriter(clientSocket.getOutputStream(),true); //Koppla user input hit. 
     Scanner newObject= new Scanner(reader); 

     while(newObject.hasNextLine()) 
     Out.setText(newObject.nextLine()); 
     // 
     } catch (IOException e) { 
     } 
    } 
    } 
+0

に設定する必要がありますが、そのソケットに接続するクライアントのためのコードを投稿することができますか? – uzr

+0

「意図したとおりに作業していない」とはどういう意味ですか?あなたはコードをステップアップしようとしましたか? –

+0

はい!デバッグしようとすると、次のメッセージが表示されます。「ターゲットVMに接続しました。アドレス: '127.0.0.1:6883'、トランスポート: 'ソケット' チャットサーバーが実行されています。 –

答えて

1

ほとんどのクライアントが間違っています。あなたはclientSocket.getOutputStream() けど... clientSocket.getOutputStream()からOut.textを設定しよう

reader = new BufferedReader(new 
    InputStreamReader(clientSocket.getInputStream())); 
    writer = new PrintWriter(clientSocket.getOutputStream(),true); 
    Out.setText(String.valueOf(writer)); 
  • は、サーバーへの、ないサーバーからのストリームです。

  • String.valueOf(writer)からどのようなことが分かりますか?クライアントで

あなたは文字列に入力リーダーからあなたに送信するものをサーバー読み、Out.text

+0

ありがとう!私はそれに応じてコードを更新しました。何かがサーバー自体にも間違っています。 –

+0

サーバ上では、実行メソッドの外側ではなく、ループの外側にあるストリームを開きます。 – Vadim

+0

また、問題の初期コードを更新しない方が良いです。それは答えを誤解させ、今質問に関連しないように見えます。 :-) – Vadim

関連する問題