Java IO / Nio:可以在多个端口上收听服务器

  • 本文关键字:服务器 IO Nio Java java tcp io
  • 更新时间 :
  • 英文 :


我在Java IO/Nio上工作。我已经为TCP和UDP(Java IO)实施了许多服务器/客户端应用程序,并最近开始在Nio上工作。

我想编写一台服务器(TCP或UDP),该服务器在收听>多个端口时执行多个任务。我总是一次实施服务器一次,一次听一个端口,我的问题可能是针对最佳实践的。但是,服务器可以在多个端口上接受客户端吗?喜欢单个服务器中的多个服务器?

我不是在寻找代码,只是程序的概念/设计是否可能。

服务器:

public class ServerAll implements Runnable {
private Socket connection;
ServerAll(Socket s) {
    this.connection = s;
}
public static void main(String[] args) {
    int port1 = 7777;
    int port2 = 8888;
    int port3 = 9999;
    int count = 0;
    try{
        ServerSocket server1 = new ServerSocket(port1);
        ServerSocket server2 = new ServerSocket(port2);
        ServerSocket server3 = new ServerSocket(port3);
        System.out.println("Server Initialized");
        while (true) {
        Socket con1 = server1.accept();
        Runnable runnable1 = new ServerAll(con1);
        Thread thread1 = new Thread(runnable1);
        thread1.start();
        Socket con2 = server2.accept();
        Runnable runnable2 = new ServerAll(con2);
        Thread thread2 = new Thread(runnable2);
        thread2.start();
        Socket con3 = server3.accept();
        Runnable runnable3 = new ServerAll(con3);
        Thread thread3 = new Thread(runnable3);
        thread3.start();
        }
    }
    catch (Exception e) {}
}
public void run() {
    try {
        DataInputStream in = new DataInputStream(connection.getInputStream());
        String clientMsg = in.readUTF();
        String replyMsg = null;
        if(clientMsg.equalsIgnoreCase("1")){
            String msg = "Server Reply on 1";
            replyMsg=msg;
        }
        if(clientMsg.equalsIgnoreCase("2")){
            String msg = "Server Reply on 2";
            replyMsg=msg;
        }
        if(clientMsg.equalsIgnoreCase("3")){
            String msg = "Server Reply on 3";
            replyMsg=msg;
        }
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.writeUTF(replyMsg);
    }
    catch (Exception e) {
        System.out.println(e);
    }
    finally {
        try {
            connection.close();
        }
        catch (IOException e){}
    }
}

客户端:

public class ClientTcpE {
public static void main(String[] args) {
    String host = "localhost";
    int port = 7777;
    System.out.println("SocketClient initialized");
    try {
        InetAddress address = InetAddress.getByName(host);
        Socket client = new Socket(address, port);
        System.out.println("Just connected to "+ client.getRemoteSocketAddress());
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);
        out.writeUTF("1");
        System.out.println("Just sent msg to server");
        InputStream inFromServer = client.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);
        String serverMsg = in.readUTF();
        System.out.println("server says : "+serverMsg);
        client.close();
    }catch(IOException e){
        e.printStackTrace();
    }   
}

是的。简单的方法是要使许多线程创建ServerSocket,绑定到端口,然后在其上调用accept

您一次只接受一个端口,即Accept()s都在同一线程中。您每个客户端仅处理一条消息。您编写代码的方式,客户必须按顺序与三个端口联系,重复。

如果要同时接受不同端口上的连接,则必须使用每个线程进行此阻止操作(或使用非阻止Nio)

最新更新