【问题标题】:Java web server with ThreadPool is not responding带有 ThreadPool 的 Java Web 服务器没有响应
【发布时间】:2017-04-05 01:19:18
【问题描述】:

我正在创建一个作为问答游戏一部分的 Java Web 服务器。出于测试目的,我包括了一个计数器。服务器有一个处理线程的 FixedThreadPool。

服务器有一个 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) {
      }
    }
  }

【问题讨论】:

  • 你能贴出连接到该套接字的客户端的代码吗?
  • “未按预期工作”是什么意思?您是否尝试过单步执行代码?
  • 是的!当我尝试调试它时,我收到以下消息:“已连接到目标 VM,地址:'127.0.0.1:6883',传输:'socket'聊天服务器正在运行”。

标签: java multithreading webserver threadpool


【解决方案1】:

客户很可能是错的。

    reader = new BufferedReader(new 
    InputStreamReader(clientSocket.getInputStream()));
    writer = new PrintWriter(clientSocket.getOutputStream(),true);   
    Out.setText(String.valueOf(writer));
  • 您尝试从clientSocket.getOutputStream() 设置Out.text 但是...clientSocket.getOutputStream() 是到服务器的流,而不是来自服务器。

  • 您希望从String.valueOf(writer) 中得到什么?

在客户端您需要将服务器从输入阅读器发送给您的内容读取为字符串并将其设置为Out.text

【讨论】:

  • 谢谢!我已经相应地更新了代码。服务器本身也有问题。
  • 在服务器上 - 打开流不在运行方法之外,在其中但在循环之外。
  • 另外,最好不要更新有问题的初始代码。它误导了答案,现在答案看起来与问题无关。 :-)
猜你喜欢
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多