Java Socket实战(五)
}
}
3. 客户端类,主要有三个类MyClient,MyClientSimpleImpl和MyClientNIOImpl。MyClient是客户端接口类,用来向Server端发送请求并获取相应;MyClientSimpleImpl和MyClientNIOImpl是两个实现类,其中MyClientSimpleImpl是使用简单Socket实现的,MyClientNIOImpl是使用java nio包里的类实现的,这个实现会有更好的性能。
MyClient.java
[java]
package com.googlecode.garbagecan.test.socket.sample10;
public interface MyClient {
public T execute(MyRequest request, MyResponseHandler handler);
public MyResponse execute(MyRequest request);
}
MyClientSimpleImpl.java
[java]
package com.googlecode.garbagecan.test.socket.sample10;
import com.googlecode.garbagecan.test.socket.IOUtil;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
public class MyClientSimpleImpl implements MyClient {
private String host;
private int port;
public MyClientSimpleImpl(String host, int port) {
this.host = host;
this.port = port;
}
public T execute(MyRequest request, MyResponseHandler handler) {
MyResponse response = execute(request);
return handler.handle(response);
}
public MyResponse execute(MyRequest request) {
MyResponse response = null;
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(host, port);
socket.connect(socketAddress, 10 * 1000);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(request);
oos.flush();
ois = new ObjectInputStream(socket.getInputStream());
Object obj = ois.readObject();
if (obj != null) {
response = (MyResponse)obj;
}
} catch(IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} finally {
IOUtil.closeQuietly(ois);
IOUtil.closeQuietly(oos);
IOUtil.closeQuietly(socket);
}
return response;
}
}
MyClientNIOImpl.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.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MyClientNIOImpl implements MyClient {
private final static Logger logger = Logger.getLogger(MyClientNIOImpl.class.getName());
private String host;
private int port;
public MyClientNIOImpl(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public T execute(MyRequest request, MyResponseHandler han