Много клиентское серверное приложение Java - как организовать сокеты - PullRequest
0 голосов
/ 25 марта 2012

_ Эй, у меня есть вопрос. Я хочу написать приложение, которое будет иметь несколько чатов, комнат и т. Д. И теперь у меня есть некоторые проблемы с сервером. Моя концепция - хранить данные клиентов в классах Vector of ClientSocket.

Класс ClientSocket будет выглядеть так:

public class ClientSocket {
    int client_id;
    Socket socket;
}

В главном потоке сервера:

ServerSocket serverSocket;
Vector<ClientSocket> sockets;

И идея такова: когда будет установлено новое соединение, создайте новый поток, передайте вектор сокетов в качестве параметра, сгенерируйте идентификатор игрока, выполните итерации по элементам вектора, проверьте, существует ли client_id, если нет, установите идентификатор, если да, генерировать дальше и делать то же самое.

А в чем проблема? Я беспокоюсь о синхронизации. Что произойдет, если два клиента прибудут одновременно, а размер вектора изменится за это время? Я делаю это правильно? Маби, есть лучшая идея организовать это?

Заранее спасибо Marcin

// редактировать

Я имел в виду такую ​​ситуацию, но думаю, что я буду использовать решение Питера Лоури:

Situation

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Так как вам нужно искать клиента по client_id, я бы использовал карту.Если вы используете ConcurrentMap, он будет поточно-ориентированным.

ConcurrentMap<Integer, Socket> socketByClientIdMap = new ConcurrentHashMap<>();

// check if a client exists already,
if (socketByClientIdMap.containsKey(clientId))

//  add a socket by client id.
socketByClientIdMap.put(clientId, socket);

// get a socket for a client_id
Socket s = socketByClientIdMap.get(clientId);
0 голосов
/ 25 марта 2012

Что будет, если два клиента приедут одновременно, и размер вектора будет меняться в то же время?

Так как при новом соединении вы создаете новую тему (как вы говорите в своем посте)

когда новое соединение установлено, создайте новый поток, пропустите сокеты вектор как параметр

тогда у вас есть 2 потока для 2 клиентов, которые приходят одновременно.
В результате 2 потока работают на Vector, который вы используете.

Vector как класс сам по себе synchronized, поэтому никакого вреда не будет.

Но также Vector считается довольно устаревшей коллекцией, поэтому, возможно, вы захотите использовать более новые структуры данных коллекции, такие как List, которые не синхронизированы и должны будут использовать синхронизированную оболочку , предлагаемую Collection s или синхронизировать себя.

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