Почему мое сообщение отправляется только один раз на сервер сокетов Java? - PullRequest
0 голосов
/ 05 июня 2018

существует сервер, который считается сервером нескольких клиентов одновременно.

Поэтому, когда клиенты подключаются, он добавляется в массив клиентов.И когда сервер получает сообщение, оно отправляется всем клиентам.Он отлично работает, когда подключен один клиент, но когда у меня есть 2 клиента одновременно, сообщение отправляется только один раз, после этого оно больше не работает.В чем проблема?

Сервер

static DataInputStream inputStream;
static DataOutputStream outputStream;

static ServerSocket serverSocket;
static final int PORT = 3003;

static Socket someClient;

static List<Socket> clients = new ArrayList<>();

public Server()
{
    start();
}

public static void main(String[] args) throws IOException
{
    try{
        serverSocket = new ServerSocket(PORT);

        print("Server started on " + serverSocket.getInetAddress().getHostAddress());

        while (true)
        {
            someClient = serverSocket.accept();

            new Server();
        }

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

@Override
public void run()
{
    try{
        clients.add(someClient);

        print("Connected from " + someClient.getInetAddress().getHostAddress());

        InputStream sin = someClient.getInputStream();
        OutputStream sout = someClient.getOutputStream();

        inputStream = new DataInputStream(sin);
        outputStream = new DataOutputStream(sout);

        String message;

        while (true)
        {
            message = inputStream.readUTF();

            print(message);

            for (int i = 0; i < clients.size(); i++)
            {
                Socket client = clients.get(i);

                OutputStream os = client.getOutputStream();

                DataOutputStream oss = new DataOutputStream(os);

                oss.writeUTF(message);
            }
        }
    } catch (Exception e){
        e.printStackTrace();
    }
}

Клиент

socket = new Socket("0.0.0.0", 3003);

        InputStream sin = socket.getInputStream();
        OutputStream sout = socket.getOutputStream();

        inputStream = new DataInputStream(sin);
        outputStream = new DataOutputStream(sout);

        sendButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(key != null && key.length() == 16)
                {
                    Date date = new Date();

                    String msg = ">> " + nickname + ": " + messageField.getText()+" | " + date.getHours()+":"+date.getMinutes()+"\n";

                    try {
                        outputStream.writeUTF(Encrypt.AESEncrypt(key, msg));
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

                    messageField.setText("");
                }
                else if(key == null)
                    JOptionPane.showMessageDialog(J_Frame, "Your key field is empty");
                else if(key.length() != 16)
                    JOptionPane.showMessageDialog(J_Frame, "Key's length should be 16 symbols");
            }
        });

        while (true)
        {

            String message;

            message = inputStream.readUTF();

            append("\n" + Encrypt.AESDecrypt(key, message));
        }

    } catch (Exception e1) {
        clear();
        append(">> Unable to connect to the server.");
        hideButtons();
    }

1 Ответ

0 голосов
/ 05 июня 2018

Каждый раз, когда клиент подключается к вашему серверу, он заменяет предыдущее соединение:

while (true)
{
        someClient = serverSocket.accept();
        ...
}

someClient является статическим:

static Socket someClient;

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

Как указал Питер Лори в комментариях,Потоки также должны быть нестатичными: на самом деле

static DataInputStream inputStream;
static DataOutputStream outputStream;

факт, что вы всегда читаете из «последнего» * ​​1015 *, может быть основной причиной описываемого вами поведения.outputStream кажется неиспользованным, поэтому лучше удалить его.

В дополнение к этому, для фактической отправки данных может потребоваться сбросить OutputStreams.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...