Java Socket实战(二)

2014-11-24 10:46:19 · 作者: · 浏览: 1
ocket server = new ServerSocket(port);
while (true) {
Socket socket = server.accept();
invoke(socket);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
}
@Override
public void shutdown() throws Exception {
// Implement me
}
private void invoke(final Socket socket) {
new Thread(new Runnable() {
public void run() {
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
try {
ois = new ObjectInputStream(socket.getInputStream());
oos = new ObjectOutputStream(socket.getOutputStream());
Object obj = ois.readObject();
MyRequest request = (MyRequest) obj;
MyResponse response = execute(request);
oos.writeObject(response);
oos.flush();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
IOUtil.closeQuietly(ois);
IOUtil.closeQuietly(oos);
IOUtil.closeQuietly(socket);
}
}
}).start();
}
private MyResponse execute(MyRequest request) throws Exception {
Class clazz = request.getRequestClass();
String methodName = request.getRequestMethod();
Class< >[] parameterTypes = request.getRequestParameterTypes();
Method method = clazz.getDeclaredMethod(methodName, parameterTypes);
Object[] parameterValues = request.getRequestParameterValues();
final Object obj = method.invoke(clazz.newInstance(), parameterValues);
return new MyGenericResponse(obj);
}
}
MyServerNIOImpl.java
[java]
package com.googlecode.garbagecan.test.socket.sample10;
import com.googlecode.garbagecan.test.socket.SerializableUtil;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
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.logging.Level;
import java.util.logging.Logger;
public class MyServerNIOImpl implements MyServer {
private final static Logger logger = Logger.getLogger(MyServerNIOImpl.class.getName());
private int port;
public MyServerNIOImpl(int port) {
this.port = port;
}
public void startup() throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
Selector selector = null;
ServerSocketChannel serverSocketChannel = null;
try {
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().setReuseAddress(true);