天天看點

java nio server和lua client

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()