import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NIOServer {
/*辨別數字*/
private int flag = 0;
/*緩沖區大小*/
private int BLOCK = 4096;
/*接受資料緩沖區*/
private ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);
/*發送資料緩沖區*/
private ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);
private Selector selector;
public NIOServer(int port) throws IOException {
// 打開伺服器套接字通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 伺服器配置為非阻塞
serverSocketChannel.configureBlocking(false);
// 檢索與此通道關聯的伺服器套接字
ServerSocket serverSocket = serverSocketChannel.socket();
// 進行服務的綁定
serverSocket.bind(new InetSocketAddress(port));
// 通過open()方法找到Selector
selector = Selector.open();
// 注冊到selector,等待連接配接
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server Start----8383:");
}
// 監聽
private void listen() throws IOException {
while (true) {
// 選擇一組鍵,并且相應的通道已經打開
selector.select();
// 傳回此選擇器的已選擇鍵集。
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
iterator.remove();
handleKey(selectionKey);
}
}
}
// 處理請求
private void handleKey(SelectionKey selectionKey) throws IOException {
// 接受請求
try{
ServerSocketChannel server = null;
SocketChannel client = null;
String receiveText;
String sendText;
int count=0;
// 測試此鍵的通道是否已準備好接受新的套接字連接配接。
if (selectionKey.isAcceptable()) {
// 傳回為之建立此鍵的通道。
server = (ServerSocketChannel) selectionKey.channel();
// 接受到此通道套接字的連接配接。
// 此方法傳回的套接字通道(如果有)将處于阻塞模式。
client = server.accept();
// 配置為非阻塞
client.configureBlocking(false);
// 注冊到selector,等待連接配接
client.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
} else if (selectionKey.isValid()) {
// 傳回為之建立此鍵的通道。
client = (SocketChannel) selectionKey.channel();
//将緩沖區清空以備下次讀取
receivebuffer.clear();
//讀取伺服器發送來的資料到緩沖區中
count = client.read(receivebuffer);
if (count > 0) {
receiveText = new String( receivebuffer.array(),0,count);
System.out.println("伺服器端接受用戶端資料--:"+receiveText);
}
//将緩沖區清空以備下次寫入
sendbuffer.clear();
// 傳回為之建立此鍵的通道。
client = (SocketChannel) selectionKey.channel();
sendText="message from server--" + flag++;
//向緩沖區中輸入資料
sendbuffer.put(sendText.getBytes());
//将緩沖區各标志複位,因為向裡面put了資料标志被改變要想從中讀取資料發向伺服器,就要複位
sendbuffer.flip();
//輸出到通道
client.write(sendbuffer);
System.out.println(sendText.length()+"伺服器端向用戶端發送資料--:"+sendText);
Thread.sleep(1000);
}
}
catch(Exception e){}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int port = 8383;
NIOServer server = new NIOServer(port);
server.listen();
}
}
local socket = require("socket")
client = socket.connect("127.0.0.1", 8383)
client:send("send: client word 111\n")
--client:settimeout(0)
while true do
s= client:receive(22)--夠了22才print
-- if s~=nil then
print(s)
-- break
-- end
end
client:close()