#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. Я не думаю, что вам нужно несколько серверов на нескольких портах. Стандартный способ сделать это — иметь один поток прослушивания на одном порту, который запускает новый поток для обработки каждого входящего соединения. Это хорошо документировано по всему Интернету.