【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.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.put("Admin", "password");
passwords.put("Aaron", "AAAAAAAA");
passwords.put("Bob", "QWERTY");
passwords.put("Lisa", "secret");
ValidationClient client = new ValidationClient();
for (Entry
client.send(pasword.getKey(), pasword.getValue());
}
// client.stop();
}
}
使用下来,感觉不如Netty设计得那么好,细节上处理得不够优雅,用来写写demo还是挺不错的。