Редактирование кода, чтобы он мог принимать множество клиентов, присоединяющихся к серверу?

#java #multithreading #server #communication

#java #многопоточность #сервер #Информационные материалы

Вопрос:

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

Я был бы очень признателен за вашу помощь!

Мой серверный код:

 import java.net.*;
import java.lang.*;
public class RecordAppServer {
    public static void main(String[] args) throws IOException {
        final int port = 8136;
        System.out.println("Server waiting for connection on port " port);
        ServerSocket ss = new ServerSocket(port);
        Socket clientSocket = ss.accept();
        System.out.println("Recieved connection from " clientSocket.getInetAddress() " on port " clientSocket.getPort());
        //create two threads to send and recieve from client
        RecieveFromClientThread recieve = new RecieveFromClientThread(clientSocket);
        Thread thread = new Thread(recieve);
        thread.start();
        SendToClientThread send = new SendToClientThread(clientSocket);
        Thread thread2 = new Thread(send);
        thread2.start();
    }}
class RecieveFromClientThread implements Runnable
{
    Socket clientSocket=null;
    BufferedReader brBufferedReader = null;

    public RecieveFromClientThread(Socket clientSocket)
    {
        this.clientSocket = clientSocket;
    }//end constructor
    public void run() {
        try{
        brBufferedReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));       

        String messageString;
        while(true){
        while((messageString = brBufferedReader.readLine())!= null){//assign message from client to messageString
            if(messageString.equals("EXIT"))
            {
                break;//break to close socket if EXIT
            }
            System.out.println("From Client: "   messageString);//print the message from client
            //System.out.println("Please enter something to send back to client..");
        }
        this.clientSocket.close();
        System.exit(0);
    }

    }
    catch(Exception ex){System.out.println(ex.getMessage());}
    }
}//end class RecieveFromClientThread
class SendToClientThread implements Runnable
{
    PrintWriter pwPrintWriter;
    Socket clientSock = null;

    public SendToClientThread(Socket clientSock)
    {
        this.clientSock = clientSock;
    }
    public void run() {
        try{
        pwPrintWriter =new PrintWriter(new OutputStreamWriter(this.clientSock.getOutputStream()));//get outputstream

        while(true)
        {
            String msgToClientString = null;
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));//get userinput

            msgToClientString = input.readLine();//get message to send to client

            pwPrintWriter.println(msgToClientString);//send message to client with PrintWriter
            pwPrintWriter.flush();//flush the PrintWriter
            //System.out.println("Please enter something to send back to client..");
        }//end while
        }
        catch(Exception ex){System.out.println(ex.getMessage());}
    }//end run
}//end class SendToClientThread
  

Мой клиентский код:

 import java.io.*;
import java.net.*;
public class RecordAppClient {
    public static void main(String[] args)
    {
        try {
            Socket sock = new Socket("192.168.0.2",8136);
            SendThread sendThread = new SendThread(sock);
            Thread thread = new Thread(sendThread);thread.start();
            RecieveThread recieveThread = new RecieveThread(sock);
            Thread thread2 =new Thread(recieveThread);thread2.start();
        } catch (Exception e) {System.out.println(e.getMessage());} 
    }
}
class RecieveThread implements Runnable
{
    Socket sock=null;
    BufferedReader recieve=null;

    public RecieveThread(Socket sock) {
        this.sock = sock;
    }//end constructor
    public void run() {
        try{
        recieve = new BufferedReader(new InputStreamReader(this.sock.getInputStream()));//get inputstream
        String msgRecieved = null;
        while((msgRecieved = recieve.readLine())!= null)
        {
            System.out.println("From Server: "   msgRecieved);
            //System.out.println("Please enter something to send to server..");
        }
        }catch(Exception e){System.out.println(e.getMessage());}
    }//end run
}//end class recievethread
class SendThread implements Runnable
{
    Socket sock=null;
    PrintWriter print=null;
    BufferedReader brinput=null;

    public SendThread(Socket sock)
    {
        this.sock = sock;
    }//end constructor
    public void run(){
        try{
        if(sock.isConnected())
        {
            System.out.println("Client connected to " sock.getInetAddress()   " on port " sock.getPort());
            this.print = new PrintWriter(sock.getOutputStream(), true); 
        while(true){
            //System.out.println("Type your message to send to server..type 'EXIT' to exit");
            brinput = new BufferedReader(new InputStreamReader(System.in));
            String msgtoServerString=null;
            msgtoServerString = brinput.readLine();
            this.print.println(msgtoServerString);
            this.print.flush();

            if(msgtoServerString.equals("EXIT"))
            break;
            }//end while
        sock.close();}}catch(Exception e){System.out.println(e.getMessage());}
    }//end run method
}//end class
  

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

1. всегда лучше, если вы покажете нам, что вы сделали до сих пор, чтобы мы могли проверить, где у вас возникли проблемы.

Ответ №1:

Вам нужно будет реализовать многопоточный сервер.

Общая структура будет следующей:

 while(true) {
    1) Wait for client requests (Socket client = server.accept();)
    2) Create a thread with the client socket as parameter
        a) The new thread creates I/O streams (just like youre doing 
        with the PrintWriter and BufferedReader objects)
        b) Communicate with client (in your example - 
        brBufferedReader.readLine())
    3) Remove thread once the service is provided.
}
  

Я предлагаю вам взглянуть на документацию Oracle:
https://www.oracle.com/technetwork/java/socket-140484.html#multi

Это также может быть полезно:
http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html