безопасность потоков httpurlconnection - PullRequest
4 голосов
/ 17 июля 2010

Безопасен ли поток HttpUrlConnection?Т.е., если у меня есть экземпляр HttpConnection, подключенный к серверу, и этот экземпляр используется различными потоками (например, для одновременной отправки POST), как HttpUrlConnection будет обрабатывать эту ситуацию?а) Будут ли они отправлять сообщения POST последовательно или b) первый поток отправляет сообщение POST, получает ответ, а затем второй поток отправляет сообщение POST?Если они отправляют сообщения POST поочередно, это означает, что несколько активных сообщений POST к одному и тому же TCP-соединению.Это разрешено?Может ли он обрабатываться сервером?

Спасибо

Ответы [ 2 ]

13 голосов
/ 18 июля 2010

это не потокобезопасно.

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

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

хотя сегодня HTTP действительно определен поверх TCP, который является протоколом с установлением соединения, и HTTP может использовать долгоживущее TCP-соединение для нескольких запросов / ответов, это не характер HTTP.

, поскольку обмен запросом-ответом может быть реализован поверх большинства сетевых протоколов, изначально HTTP допускал возможность указания базовых протоколов. Мы можем представить http запрос / обмен ответами по электронной почте - http:/smtp/www.example.com; возможно RMI - http:/rmi/www.example.com; по умолчанию используется TCP, поэтому http:// действительно означает http:/tcp/

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

4 голосов
/ 18 июля 2010

В документах не указано, есть это или нет.После просмотра кода (http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/net/sun/net/www/protocol/http/HttpURLConnection.java.htm) выглядит, что getInputStream и getOutputStream синхронизированы.Меня беспокоит то, что если у вас есть поток, который получает входной поток, и в то же время у вас есть другой поток, который получает выходной поток, вы можете пересекать свои сигналы.inputStream и outputStream - это переменные экземпляра, которые, вероятно, не должны совместно использоваться потоками.

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

...