Программирование сокетов Java

У меня есть два вопроса по программированию сокетов Java. это будет отдельное приложение и будет построено только на J2SE.

1) Возможно ли одновременное чтение/запись через один и тот же порт в моем случае, так как это будет запрос https, поэтому порт будет 443.

2) Можно ли создать два сокетных соединения в одном Java-приложении. из которых один сокет действует как клиент, а другой - как сервер.

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


person AKV    schedule 21.12.2011    source источник


Ответы (4)


Соединение через сокет является двусторонним, поэтому вы можете читать и писать по одному соединению. Это похоже на подключение проводной вилки к розетке, отсюда и название «розетка».

Вот как ты это делаешь

Socket socket = new Socket("10.0.0.1", 1234);
OutputStream os = socket.getOutputStream();
InputStream is socket.getInputStream();
new MyInputServiceThread(is).start();

теперь вы можете писать из ОС и читать из ОС. Вы можете сделать это в одном потоке или в разных потоках, если вы ожидаете, что они не будут синхронизированы.

На 2 вы можете иметь любое количество клиентов и серверных сокетов в одном приложении. По крайней мере теоретически. Есть практические ограничения. Для серверных сокетов вы можете принять соединение, а затем создать поток, проходящий через открытый сокет, и тогда ваш серверный сокет должен быть готов принять больше соединений. Другими словами, чтобы разрешить несколько подключений к одному и тому же порту, вы должны убедиться, что вы не блокируете его после принятия подключения. Однако вы также можете открывать более одного сокета сервера в нескольких потоках.

вот пример

ServerSocket server = new ServerSocket(1234);
while (true) {
    Socket socket = server.accept();
    // Once it spawns the thread that socket connection is serviced by 
    //the thread and the        
    //server socket is ready to accept new connections.
    new Mythread(socket).start();
    // above Mythread extends Thread....    
}

Для приложения в качестве клиента ограничений нет. то есть столько, сколько вы хотите подключить.

Еще одно примечание... Для https вам также придется принимать сертификаты, что означает, что вам придется иметь дело с закрытыми открытыми ключами. Вы действительно хотите это сделать? поскольку tomcat и другие серверы приложений уже делают это. Если это будет веб-приложение, вам также нужно подумать о правильно подписанном цифровом сертификате. Если это интранет, то браузеры, используемые для доступа к нему, должны будут импортировать самогенерируемый самозаверяющий сертификат.

person Sid Malani    schedule 21.12.2011
comment
Как я уже говорил ранее, это не веб-приложение. Это будет отдельное приложение. Приложение будет запущено с использованием основного метода. Компонент «мы» не задействован. Так что я думаю, мне не нужно беспокоиться о сертификате. - person AKV; 21.12.2011
comment
Даже если это не веб-сервер, если вы используете ssl, вам нужно будет беспокоиться о сертификатах. В вашем вопросе указано https??? Который использует http поверх ssl. - person Sid Malani; 21.12.2011

На оба ваших вопроса ответ - да. Для второго вопроса вам нужно будет создать поток, который прослушивает активность на сервере.

И взгляните на это руководство.

person Francis Upton IV    schedule 21.12.2011
comment
Этот PDF-файл также является хорошим ресурсом, имхо. (Просто чтобы добавить немного больше к вашему ответу) :-) - person Deco; 21.12.2011

  1. Программа, создающая порт, является серверной программой.

  2. в серверной программе вы можете создать несколько портов, которые прослушивают запрос клиента.

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

  4. Когда клиент отправляет запрос на сервер, сервер получает буферную память, в которой размещается запрос, и сервер считывает его. Сервер также получает другую буферную память, куда сервер может записать свой ответ, необходимый для отправки обратно клиенту. Итак, да, сервер может читать и писать одновременно.

person Rahul Raina    schedule 14.05.2015

Для тех, кто все еще ищет дальнейших объяснений. Вот ссылка на несколько примеров простых игр, созданных с использованием Java Sockets. Я считаю полезным иметь некоторый код для разбора и экспериментов.

http://cs.lmu.edu/~ray/notes/javanetexamples/

person Keegan Teetaert    schedule 05.05.2017