Как создать несколько серверов, каждый из которых прослушивает разные порты?

#java #network-programming #p2p

#java #сетевое программирование #p2p

Вопрос:

Я новичок в сетевом программировании и пытаюсь написать код, который может создавать несколько серверных сокетов на разных портах. Я создаю отдельный поток для каждого сервера. Сам сервер является многопоточным, поэтому он может обрабатывать несколько клиентов. The servers.java файл, описанный ниже, вызывает многопоточный серверный класс, определенный в MultiEchoserver.java

 //Server.java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;

public class Servers{
    public static int ports [] = {1234, 1235, 1236, 1237, 1238};

    String s = "server_";

    public static void main(String args[]){
       for(int i = 0; i <ports.length; i  ){
            String s = "server_"   Integer.toString(i);
            MyRunnable serv = new MyRunnable(s, ports[i]);
            serv.start();
        //System.out.println("Server started "   s);
        }
    }


 }

class MyRunnable extends Thread{
 public static String s;
 public static int port;
 public MyRunnable(String s, int port){
    this.s = s;
    this.port = port;
}
public void run(){
    try{

        MultiEchoServer server = new MultiEchoServer(s, port);
        server.createServer();
        //server.start();
        System.out.println("HERE");

    }
    catch(Exception e){
        e.printStackTrace();
    }
}


}
 

MultiEchoServer.java

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

public class MultiEchoServer{
    private static ServerSocket serverSocket;
    private static String s; 
    private static int PORT;

public MultiEchoServer(String s, int port){
    this.s = s;
    this.PORT = port;
}

public void createServer(){
    try{
        serverSocket = new ServerSocket(PORT);
        System.out.println(s);
        System.out.println("Listening at port: "   PORT);
    }
    catch(IOException ioEx){
        System.out.println("nUnable to set up port!");
        System.exit(1);
    }
   
    try{
    do{
        
            Socket client = serverSocket.accept();
            System.out.println("nNew client accepted.n");
            ClientHandler handler = new ClientHandler(client);

            handler.start();
        }while(true); 
    }
    catch(IOException ioEx){
        ioEx.printStackTrace();
    }
    
    }
}


class ClientHandler extends Thread{
 private Socket client;
 private Scanner input;
 private PrintWriter output;

 public ClientHandler(Socket socket){
    client = socket;
    
    try{
        input = new Scanner(client.getInputStream());
        output = new PrintWriter(client.getOutputStream(), true);
    }
    catch(IOException ioEx){
        ioEx.printStackTrace();
    }
}

public void run(){
    String received;
    
    do{
        received = input.nextLine();
        
        output.println("ECHO: "   received);
        
        
    }while(!received.equals("QUIT"));
           
    try{
        if(client != null){
            System.out.println("Closing down connection");
            client.close();
        }
    }
    catch(IOException ioEx){
        System.out.println("Unable to disconnect");
    }
}
           
    
 

}

Код работает, когда я инициализирую один экземпляр сервера. Однако, когда передается целый массив номеров портов, инициализируется только сервер, прослушивающий последний порт, в то время как для других я получаю сообщение «Невозможно настроить». Все номера портов действительны.

Комментарии:

1. Пожалуйста, распечатайте трассировку стека для этого исключения и покажите ее нам. Наиболее вероятным объяснением является то, что вы привязаны к тому же порту в другом потоке. (Возможно, потому PORT , что он статичен и поэтому используется всеми MultiEchoServer созданными вами экземплярами.)

2. Какова ваша конкретная причина привязки сервера к нескольким портам?

3. Я не думаю, что вам нужно несколько серверов на нескольких портах. Стандартный способ сделать это — иметь один поток прослушивания на одном порту, который запускает новый поток для обработки каждого входящего соединения. Это хорошо документировано по всему Интернету.