Java basi c одновременный коммуникатор - не полностью принимает соединение - PullRequest
0 голосов
/ 07 марта 2020

Я хочу создать простой коммуникатор с одним сервером и несколькими клиентами, которые могли бы подключаться и отправлять на него данные. Он отлично работает без каких-либо потоков, только с одним клиентом, но как только я пытаюсь включить параллелизм, он не работает. С точки зрения клиента, существует некоторое соединение, я могу отправлять данные, но нет никаких признаков получения этих данных на сервере. Вот класс сервера:

    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;


    public class MyServerSocket implements Runnable
    {
        private ServerSocket serverSocket;

        public MyServerSocket() throws Exception
        {
            Random generator = new Random();
            this.serverSocket = new ServerSocket(generator.nextInt(65000 - 60000) + 60000, 50, InetAddress.getByName("192.168.0.105"));
        }


        public InetAddress getSocketIPAddress()
        {
            return this.serverSocket.getInetAddress();
        }

        public int getPort()
        {
            return this.serverSocket.getLocalPort();
        }

        public void run()
        {
            while (true)
            {
                System.out.println("Running a thread");
                try
                {
                    String data = null;
                    Socket client = this.serverSocket.accept();
                    String clientAddress = client.getInetAddress().getHostName();
                    System.out.println("Connection from: " + clientAddress);

                    System.out.println("Here I am");
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                    String message = "";
                    while ((data = in.readLine()) != null && data.compareToIgnoreCase("quit") != 0)
                    {
                        message = ("\r\nMessage from " + clientAddress + ": " + data);
                        System.out.println(message);
                        out.write(message);
                    }
                } catch (Exception e)
                {
                    System.out.println("Something went wrong");
                } finally
                {
                    try
                    {
                        serverSocket.close();
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }


        }
    }

Основной сервер:

import java.lang.Thread;
public class Main 
{

    public static void main(String[] args)
    {
        try
        {
            MyServerSocket socket = new MyServerSocket();
            Runnable runnable = new MyServerSocket();
            System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
            Thread thread = new Thread(runnable);
            thread.start();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Класс клиента:

    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;

    public class ClientSocket
    {
        private Socket socket;
        private Scanner scanner;

        ClientSocket(InetAddress serverAddress, int serverPort) throws Exception
        {
            this.socket = new Socket(serverAddress, serverPort);
            this.scanner = new Scanner(System.in);
        }

        public void sendData() throws Exception
        {
            String data;
            System.out.println("Please type in the message. If you want to terminate the connection, type Quit");
            PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);
            do
            {
                data = scanner.nextLine();
                out.println(data);
                out.flush();
            }while(data.compareToIgnoreCase("quit") != 0);
            out.println();
        }
    }

Основной клиент:

    import java.net.InetAddress;
    import java.util.Scanner;

    public class Main
    {
        public static void main(String[] args)
        {
            Scanner scanner = new Scanner(System.in);
            int port;
            System.out.println("Provide port at which you will communicate with the server");
            port = scanner.nextInt();

            try
            {
            ClientSocket socket1 = new ClientSocket(InetAddress.getByName("192.168.0.105"), port);
            socket1.sendData();

            }catch(Exception e)
            {
                System.out.println("Could not connect to the server.");
            }
        }
    }

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

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Хорошо, я как-то решил эту проблему, но все же мне нужно понять, как она работает:

  1. Прием соединения внутри блока try, без блока finally (и не с ресурсами), поэтому Сокет открыт постоянно.

  2. Модифицированный метод main, поэтому в нем вообще нет потоков или выполняемых объектов. Весь процесс выполняется в классе:

Код:

public class Main 
{
        public static void main(String[] args)
        {
            try
            {
                MyServerSocket socket = new MyServerSocket();
                System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
                socket.run();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
} 

Если кто-нибудь может указать мне на ошибки, которые все еще есть в этой окончательной версии кода I ' буду благодарен.

0 голосов
/ 07 марта 2020

На стороне сервера, после того, как вы примете соединение клиента, вы должны создать новый поток для обработки этого соединения:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;


public class MyServerSocket implements Runnable {
    private ServerSocket serverSocket;

    public MyServerSocket() throws Exception {
        Random generator = new Random();
        this.serverSocket = new ServerSocket(generator.nextInt(65000 - 60000) + 60000, 50, InetAddress.getByName("192.168.0.105"));
    }


    public InetAddress getSocketIPAddress() {
        return this.serverSocket.getInetAddress();
    }

    public int getPort() {
        return this.serverSocket.getLocalPort();
    }

    public void run() {
        while (true) {
            System.out.println("Running a thread");
            try(Socket client = this.serverSocket.accept()) {

                // new thread to process this client
                new Thread(() -> {
                    try {
                        String data = null;
                        String clientAddress = client.getInetAddress().getHostName();
                        System.out.println("Connection from: " + clientAddress);

                        System.out.println("Here I am");
                        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                        String message = "";
                        while (true) {
                            if (!((data = in.readLine()) != null && data.compareToIgnoreCase("quit") != 0)) break;
                            message = ("\r\nMessage from " + clientAddress + ": " + data);
                            System.out.println(message);
                            out.write(message);
                        }
                    } catch (IOException e) {
                        System.out.println("Something went wrong");
                    } 
                }).start();

            } catch (Exception e) {
                System.out.println("Something went wrong");
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...