2017-04-04 129 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

是的!當我嘗試調試它時,我收到以下消息:「連接到目標虛擬機,地址:'127.0.0.1:6883',傳輸:'套接字' 聊天服務器正在運行」。 –

回答

1

最有可能的客戶端是錯誤的。

reader = new BufferedReader(new 
    InputStreamReader(clientSocket.getInputStream())); 
    writer = new PrintWriter(clientSocket.getOutputStream(),true); 
    Out.setText(String.valueOf(writer)); 
  • 您嘗試將Out.textclientSocket.getOutputStream() 但是...... clientSocket.getOutputStream()是流服務器,而不是從服務器設置。

  • 你期望從String.valueOf(writer)得到什麼?

在客戶端,您需要閱讀從輸入讀卡器傳送給你的服務器爲字符串,並將其設置爲Out.text

+0

謝謝!我相應地更新了代碼。服務器本身也有問題。 –

+0

在服務器上 - 打開不在run方法之外的流,但在循環之外。 – Vadim

+0

此外,最好不要更新有問題的初始代碼。它誤導了答案,現在答案看起來與問題無關。 :-) – Vadim