socket.io|Socket 异步naga使用实例详解

更新时间:2018-09-13    来源:ios    手机版     字体:

【www.bbyears.com--ios】

naga这个项目是在Stack Overflow上听别人推荐的,刚好我要写的东西也比较简单,看到项目主页上的伪代码也相当简洁,就试用了下。

 代码如下

NIOService service = new NIOService;
NIOServerSocket serverSocket = service.openServerSocket(1234);
serverSocket.setConnectionAcceptor(myAcceptor);
serverSocket.listen(myObserver);
NIOService service = new NIOService;
NIOSocket serverSocket = service.openSocket(www.111cn.net, 1234);
socket.listen(myObserver);
// Asynchronous write by default:
socket.write("Some message".getBytes());

代码相当简单,就不多罗嗦了,改造自官方的演示代码。

正如示例的伪代码所示,只要在socket的监听器中添加一个ServerSocketObserverAdapter即可

 代码如下

package com.socket.naga;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
import naga.ConnectionAcceptor;
import naga.NIOServerSocket;
import naga.NIOService;
import naga.NIOSocket;
import naga.ServerSocketObserverAdapter;
import naga.SocketObserverAdapter;
import naga.packetreader.RegularPacketReader;
import naga.packetwriter.RegularPacketWriter;
 
public class ValidationServer {
 private NIOService service;
 private NIOServerSocket socket;
 
 public ValidationServer() throws IOException {
  service = new NIOService();
 }
 
 public void start() throws IOException {
  int port = 9001;
  socket = service.openServerSocket(port);
  final Map passwords = new HashMap();
  passwords.put("Admin", "password");
  passwords.put("Aaron", "AAAAAAAA");
  passwords.put("Bob", "QWERTY");
  passwords.put("Lisa", "secret");
 
  socket.listen(new ServerSocketObserverAdapter() {
   public void newConnection(NIOSocket nioSocket) {
    System.out.println("Received connection: " + nioSocket);
 
    nioSocket.setPacketReader(new RegularPacketReader(1, true));
 
    nioSocket.setPacketWriter(new RegularPacketWriter(1, true));
 
    nioSocket.listen(new SocketObserverAdapter() {
     public void packetReceived(NIOSocket socket, byte[] packet) {
      System.out.println("Login attempt from " + socket);
      try {
       DataInputStream stream = new DataInputStream(new ByteArrayInputStream(packet));
 
       String user = stream.readUTF();
       String password = stream.readUTF();
 
       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
       DataOutputStream out = new DataOutputStream(byteArrayOutputStream);
 
       if (!passwords.containsKey(user)) {
        System.out.println("Unknown user: " + user);
        out.writeUTF("NO_SUCH_USER");
       } else if (!passwords.get(user).equals(password)) {
        out.writeUTF("INCORRECT_PASS");
        System.out.println("Failed login for: " + user);
       } else {
        out.writeUTF(user + " LOGIN_OK");
        System.out.println("Successful login for: " + user);
       }
 
       out.flush();
       socket.write(byteArrayOutputStream.toByteArray());
 
       socket.closeAfterWrite();
      } catch (IOException e) {
       socket.close();
      }
     }
    });
   }
 
  });
  socket.setConnectionAcceptor(ConnectionAcceptor.ALLOW);
 
  while (true) {
   service.selectBlocking();
  }
 }
 
 public void close() {
  if (socket.isOpen())
   socket.close();
 
  if (service.isOpen())
   service.close();
 }
 
 public static void main(String[] args) {
  try {
   ValidationServer validationServer = new ValidationServer();
   validationServer.start();
   // validationServer.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

客户端是在监听器中添加SocketObserver

 代码如下 package com.socket.naga;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
 
import naga.NIOService;
import naga.NIOSocket;
import naga.SocketObserver;
import naga.packetreader.RegularPacketReader;
import naga.packetwriter.RegularPacketWriter;
 
public class ValidationClient {
 private NIOService service;
 private NIOSocket socket;
 
 public ValidationClient() throws IOException {
  service = new NIOService();
 }
 
 public void send(final String account, final String password) throws IOException {
  ByteArrayOutputStream stream = new ByteArrayOutputStream();
  DataOutputStream dataStream = new DataOutputStream(stream);
  dataStream.writeUTF(account);
  dataStream.writeUTF(password);
  dataStream.flush();
  final byte[] content = stream.toByteArray();
  dataStream.close();
 
  socket = service.openSocket("127.0.0.1", 9001);
  socket.setPacketReader(new RegularPacketReader(1, true));
  socket.setPacketWriter(new RegularPacketWriter(1, true));
 
  // Start listening to the socket.
  socket.listen(new SocketObserver() {
   public void connectionOpened(NIOSocket nioSocket) {
    System.out.println("Sending login..." + account + " // " + password);
    nioSocket.write(content);
   }
 
   public void packetReceived(NIOSocket socket, byte[] packet) {
    try {
     // Read the UTF-reply and print it.
     String reply = new DataInputStream(new ByteArrayInputStream(packet)).readUTF();
     System.out.println("Reply was: " + reply);
    } catch (Exception e) {
     // e.printStackTrace();
    }
   }
 
   public void connectionBroken(NIOSocket nioSocket, Exception exception) {
    System.out.println("Connection failed." + nioSocket.isOpen() + " " + exception.getMessage());
   }
  });
 
  while (true) {// wait
   service.selectBlocking();
  }
 }
 
 public static void main(String[] args) throws IOException {
  final Map passwords = new HashMap();
  passwords.put("Admin", "password");
  passwords.put("Aaron", "AAAAAAAA");
  passwords.put("Bob", "QWERTY");
  passwords.put("Lisa", "secret");
 
  ValidationClient client = new ValidationClient();
  for (Entry pasword : passwords.entrySet()) {
   client.send(pasword.getKey(), pasword.getValue());
  }
  // client.stop();
 }
}

使用下来,感觉不如Netty设计得那么好,细节上处理得不够优雅,用来写写demo还是挺不错的。

本文来源:http://www.bbyears.com/shoujikaifa/44309.html

热门标签

更多>>

本类排行