2012-09-09 18 views
8

Java NIO'da, bir ServerSocketChannel'in neden bir seçiciye sahip olması gerektiği kolayca anlaşılabilir. Seçici, G/Ç işlemleri için hazır olan birkaç istemci kanalı arasından kontrol edebilir. Bununla birlikte, bazı yorumlarda web üzerinde okudum, seçici mekanizma, istemci SocketChannel'e uygulanmaktadır. Bir seçicinin neden bir müşteriye kullandığını anlamıyorum. Herkesin sadece tek bir sunucunun olduğu durumlarda neden kullanıldığını açıklayabilir mi?Java NIO'da bir istemci SocketChannel için bir seçici mi?

+0

Örneğin, sayfanın altındaki http://tutorials.jenkov.com/java-nio/socket-channel.html seçiciler ve SocketChannels için öneri yapar. – Arvanem

+0

Ama müşteriler için hiç birisini önermiyor. Bu öğreticide pek çok kötü tavsiye var: örneğin, engelleme olmayan modda döngü. Daha iyi bir tane bulun. – EJP

+0

@EJP deneyecek, teşekkürler. – Arvanem

cevap

6

Yüzlerce sunucuya bağlanmadıkça, bir istemcideki engellenmeyen NIO'nun noktasını görmek zordur. Ancak, engellemeyen bir NIO kullanıyorsanız, kesinlikle bir Selector kullanmanız gerekir, aksi takdirde kanalı ne zaman okuyacağınızı veya tamamlanmamış bir yazının ardından tekrar yazılabileceğini bilemezsiniz.

5

Seçiciler, tek bir iş parçacığı kullanarak birden fazla kanal arasında eşzamanlı iletişim hizmeti vermenizi sağlar. Aynı anda birden fazla sunucuyla iletişim kurmanız gerektiğinde veya istemcinin rolündeki eşdüzey bilgisayarlarla iletişim kurduğunuzda (örneğin torrent okurken) bir istemcide yararlı olabilir.

+0

Cevabınız için teşekkür ederiz. İstemciler ve sunucu arasındaki SelectionKey'lerin karşılıklı değişimi için istemciler için Seçicilerin açıkça gerekli olduğuna katkıda bulunmak isterim. Katılıyor musun katılmıyor musun? – Arvanem

+0

@Arvanem "Gerekli" olduklarını söyleyemem, çünkü aynı şeyi iki iplik kullanarak yapabilirsiniz. Yine de seçiciler kesinlikle uygun olup, eşzamanlı bir görevi ele almak için tek bir iş parçacığı kod yazmanızı sağlar. – dasblinkenlight

+0

Ancak, sunucu soket kanalınızın bir seçici kullanıyor olması şarttır, değil mi? SelectionKey'i sunucuya geri göndermenize izin veren bir seçiciden ayrı bir yol olmadığı için? – Arvanem

İlgili konular