關於NIO進行socket通訊的一個不解的地方
伺服器端程式碼:
客戶端程式碼:
我已經和網上的N多類似程式對照過了,但是我就是弄不明白,為什麼客戶端明明只是傳送了三次資料,而伺服器端卻會不停地執行write和read操作呢?不是應該執行一次之後就完了的嗎?
package nio.tcp; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.Iterator; import java.util.Set; public class UnblockServer { public static void main(String[] args) { SocketChannel socket = null; try { // 開啟一個選擇器 Selector selector = Selector.open(); // 客戶端要使用SocketChannel,對應伺服器的ServerSocketChannel ServerSocketChannel ssc = ServerSocketChannel.open(); // 繫結伺服器IP和埠 InetSocketAddress isa = new InetSocketAddress(8710); ssc.socket().bind(isa); ssc.configureBlocking(false); // 向selector註冊,要處理的是接收傳入事件,所以許可權設定為OP_ACCEPT SelectionKey acceptKey = ssc.register(selector,SelectionKey.OP_ACCEPT); // 操作? while (selector.select() > 0) { Set<SelectionKey> readyKeys = selector.selectedKeys(); Iterator it = readyKeys.iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey) it.next(); it.remove(); if (key.isAcceptable()) { System.out.println("Key is Acceptable"); socket = (SocketChannel) ssc.accept(); socket.configureBlocking(false); socket.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); } if (key.isReadable()) { System.out.println("Key is readable"); socket = (SocketChannel) key.channel(); ByteBuffer buf = ByteBuffer.allocate(1024); socket.read(buf); buf.flip(); // 這段實用 Charset charset = Charset.forName("us-ascii"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buf); String result = charBuffer.toString(); System.out.println("Receive Data:" + result); } if (key.isWritable()) { System.out.println("Key is writable"); String msg = "Message from server"; socket = (SocketChannel) key.channel(); //型別轉換,實用 Charset set = Charset.forName("us-ascii"); CharsetDecoder dec = set.newDecoder(); CharBuffer charBuf = dec.decode(ByteBuffer.wrap(msg.getBytes())); System.out.println("Message from server:" + charBuf.toString()); int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes())); } } } } catch (Exception e) { e.printStackTrace(); } } } <p class="indent"> |
客戶端程式碼:
package nio.tcp; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class UnblockClient { public static void main(String[] args) { try { InetSocketAddress ia = new InetSocketAddress(InetAddress.getLocalHost(),8710); //客戶端要使用SocketChannel,對應伺服器的ServerSocketChannel SocketChannel client = SocketChannel.open(); client.connect(ia); //設定為非阻塞,否則就和剛才的程式沒啥區別了 client.configureBlocking(false); //傳送資料 sendMessage(client); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static int sendMessage(SocketChannel client) { System.out.println("Inside SendMessage"); String msg = null; ByteBuffer bytebuf; int nBytes = 0; try { msg = "It's message from client!"; System.out.println("msg is "+msg); bytebuf = ByteBuffer.wrap(msg.getBytes()); for (int i = 0; i < 3; i++) { nBytes = client.write(bytebuf); System.out.println(i + " finished"); } try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } client.close(); return -1; } catch (IOException e) { e.printStackTrace(); } return nBytes; } } <p class="indent"> |
我已經和網上的N多類似程式對照過了,但是我就是弄不明白,為什麼客戶端明明只是傳送了三次資料,而伺服器端卻會不停地執行write和read操作呢?不是應該執行一次之後就完了的嗎?
相關文章
- Java基礎(Socket通訊和NIO)Java
- JAVA - 基於Socket的多執行緒通訊Java執行緒
- 請教一個關於NIO執行方式的問題
- Android Socket連線,使用Socket進行通訊(Android)Android
- 在 Laravel 中使用 Workerman 進行 socket 通訊Laravel
- socket通訊的建立
- php的socket通訊PHP
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- 簡單的Socket通訊
- Java Nio通訊Java
- socket通訊
- 基於 socket.io 快速實現一個實時通訊應用
- 一個關於Java Socket的問題,大家看一下Java
- socket 完成簡單的通訊
- 關於iOS多執行緒通訊的相關總結iOS執行緒
- java的nio之:java的bio流下實現的socket伺服器同步阻塞模型和socket的偽非同步的socket伺服器的通訊模型Java伺服器模型非同步
- unix socket通訊
- NIO Socket的2個問題?請高手幫忙!
- Java網路程式設計和NIO詳解1:JAVA 中原生的 socket 通訊機制Java程式設計
- 關於Java NIO的一些問題,求助。Java
- 關於值物件中不解之處物件
- 物聯網通訊與普通簡訊通訊的區別和要注意的地方
- 使用SuperSocket的FixedHeaderReceiveFilter進行通訊HeaderFilter
- 採用管道進行通訊的例子
- 14.8 Socket 一收一發通訊
- Java NIO 執行緒 的一個問題Java執行緒
- 請教一個關於JAVA SOCKET程式設計中的問題Java程式設計
- 程式間通訊(Socket)
- socket.IO通訊
- Android Socket 通訊Android
- 【Python】socket通訊Python
- 【Socket】關於socket長連線的心跳包
- Fanuc Socket Message通訊第一講
- 一段最簡單的使用socket.io進行伺服器和客戶端通訊的例子程式碼伺服器客戶端
- Java的Socket通訊簡單例項Java單例
- USB共享網路:android手機通過USB與Ubuntu進行socket網路通訊AndroidUbuntu
- 通過串列埠進行通訊 :串列埠
- Java Socket 之 NIOJava