繁体   English   中英

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

[英]Creating a socket server which allows multiple connections via threads and Java

我正在尝试调整我的简单套接字服务器,以便通过多线程可以有多个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中的提示,但是他们在这里提供的示例似乎使用了很多外部资源和类似KnockKnockProtocol等。

有人能帮我解决这个问题吗?

非常感谢你!

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

// 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);
}

这意味着接受连接的同一线程正在尝试处理连接。 这不会让您同时使用多个连接。

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

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

这将使您的“主”线程可以等待下一个连接。

(顺便说一下, KnockKnockProtocol类并不是真正的“外部” - 它是示例的一部分。他们只是没有说清楚源是在这里 ......)

你不是多线程的。 您正在创建一个绑定在端口上的线程,然后从任何客户端套接字读取,直到连接关闭。

您需要将套接字传递给新线程并将其读取。

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.
    }
}

//...
ServerSocket serverSocket = null;
serverSocket = new ServerSocket(5432);
for (;;) {
    Socket clientSocket = null;
    clientSocket = serverSocket.accept();
    //delegate to new thread
    new Thread(new DoSomethingWithInput(clientSocket)).start();
} //...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM