有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

创建一个socket服务器,允许通过线程和Java进行多个连接

我正在尝试调整我的简单socket服务器,以便它可以通过多线程实现多个TCP连接,但我似乎无法让它工作。到目前为止,我的代码如下,我真的不确定从这里走到哪里:

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

public class DoSomethingWithInput implements Runnable {
   private final Socket clientSocket; //initialize in const'r
   public void run() {


     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String nextline;
        while ((nextline = in.readLine())!=null) {
           System.out.println(nextline);
        } //... close socket, etc.
    }
}


public class Socket{

  public Socket() {
}
@Override
public void run() {
  try {
    ServerSocket serverSocket = null;
    serverSocket = new ServerSocket(5432);
    for (;;) {
      ServerSocket serverSocket = null;
      serverSocket = new ServerSocket(5432);
      for (;;) {
        Socket clientSocket = null;
        clientSocket = serverSocket.accept();
        //delegate to new thread
        new Thread(new DoSomethingWithInput(clientSocket)).start();
      }
    }
  }catch (IOException e) {
   System.err.println("Could not listen on port: 5432.");
   System.exit(1);
}
}
}

有谁能给我一些建议,告诉我如何做到这一点,以及为什么我目前的实现无法工作?我在这里浏览了Java教程http://download.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServerThread.java中的技巧,但是他们在这里给出的示例似乎使用了很多外部源和类,比如KnockProtocol等

有谁能帮我解决这个问题吗

非常感谢


共 (1) 个答案

  1. # 1 楼答案

    问题是,当前您正在接受连接,但随后立即对其执行阻塞读取,直到其关闭:

    // After a few changes...
    Socket clientSocket = serverSocket.accept();
    BufferedReader in = new BufferedReader(new InputStreamReader(
         clientSocket.getInputStream()));
    String nextLine;
    while ((nextLine = in.readLine()) != null) {
        System.out.println(nextline);
    }
    

    这意味着接受连接的线程正试图处理连接。这不允许您同时使用多个连接

    相反,创建一个类(例如ConnectionHandler),该类实现Runnable,并且有一个采用Socket的构造函数。它的run方法应该处理连接。然后将代码更改为:

    Socket clientSocket = serverSocket.accept();
    Runnable connectionHandler = new ConnectionHandler(clientSocket);
    new Thread(connectionHandler).start();
    

    这将使你的“主”线程可以等待下一次连接

    (顺便说一句,KnockKnockProtocol类并不是真正的“外部的”——它是示例的一部分。他们只是没有明确说明source is here……)