import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;/**
* 維持連接的消息對象。
*
* 創建時間:2010-7-18 上午12:22:09
* @author HouLei
* @since 1.0*/
public classKeepAlive implements Serializable{private static final long serialVersionUID = -2813120366138988480L;/*覆蓋該方法,僅用于測試使用。
* @see java.lang.Object#toString()*/@OverridepublicString toString() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t維持連接包";
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentHashMap;/**
* C/S架構的客戶端對象,持有該對象,可以隨時向服務端發送消息。
*
* 創建時間:2010-7-18 上午12:17:25
* @author HouLei
* @since 1.0*/
public classClient {/**
* 處理服務端發回的對象,可實現該接口。*/
public static interfaceObjectAction{voiddoAction(Object obj,Client client);
}public static final classDefaultObjectAction implements ObjectAction{public voiddoAction(Object obj,Client client) {
System.out.println("處理:\t"+obj.toString());
}
}public static voidmain(String[] args) throws UnknownHostException, IOException {
String serverIp= "127.0.0.1";int port = 65432;
Client client= newClient(serverIp,port);
client.start();
}privateString serverIp;private intport;privateSocket socket;private boolean running=false;private longlastSendTime;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();public Client(String serverIp, intport) {this.serverIp=serverIp;this.port=port;
}public voidstart() throws UnknownHostException, IOException {if(running)return;
socket= newSocket(serverIp,port);
System.out.println("本地端口:"+socket.getLocalPort());
lastSendTime=System.currentTimeMillis();
running=true;new Thread(newKeepAliveWatchDog()).start();new Thread(newReceiveWatchDog()).start();
}public voidstop(){if(running)running=false;
}/**
* 添加接收對象的處理對象。
* @param cls 待處理的對象,其所屬的類。
* @param action 處理過程對象。*/
public void addActionMap(Classcls,ObjectAction action){
actionMapping.put(cls, action);
}public voidsendObject(Object obj) throws IOException {
ObjectOutputStream oos= newObjectOutputStream(socket.getOutputStream());
oos.writeObject(obj);
System.out.println("發送:\t"+obj);
oos.flush();
}classKeepAliveWatchDog implements Runnable{long checkDelay = 10;long keepAliveDelay = 2000;public voidrun() {while(running){if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){try{
Client.this.sendObject(newKeepAlive());
}catch(IOException e) {
e.printStackTrace();
Client.this.stop();
}
lastSendTime=System.currentTimeMillis();
}else{try{
Thread.sleep(checkDelay);
}catch(InterruptedException e) {
e.printStackTrace();
Client.this.stop();
}
}
}
}
}classReceiveWatchDog implements Runnable{public voidrun() {while(running){try{
InputStreamin =socket.getInputStream();if(in.available()>0){
ObjectInputStream ois= new ObjectInputStream(in);
Object obj=ois.readObject();
System.out.println("接收:\t"+obj);
ObjectAction oa= actionMapping.get(obj.getClass());
oa= oa==null?newDefaultObjectAction():oa;
oa.doAction(obj, Client.this);
}else{
Thread.sleep(10);
}
}catch(Exception e) {
e.printStackTrace();
Client.this.stop();
}
}
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;/**
* C/S架構的服務端對象。
*
* 創建時間:2010-7-18 上午12:17:37
* @author HouLei
* @since 1.0*/
public classServer {/**
* 要處理客戶端發來的對象,并返回一個對象,可實現該接口。*/
public interfaceObjectAction{
Object doAction(Object rev);
}public static final classDefaultObjectAction implements ObjectAction{publicObject doAction(Object rev) {
System.out.println("處理并返回:"+rev);returnrev;
}
}public static voidmain(String[] args) {int port = 65432;
Server server= newServer(port);
server.start();
}private intport;private volatile boolean running=false;private long receiveTimeDelay=3000;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();privateThread connWatchDog;public Server(intport) {this.port =port;
}public voidstart(){if(running)return;
running=true;
connWatchDog= new Thread(newConnWatchDog());
connWatchDog.start();
}
@SuppressWarnings("deprecation")public voidstop(){if(running)running=false;if(connWatchDog!=null)connWatchDog.stop();
}public void addActionMap(Classcls,ObjectAction action){
actionMapping.put(cls, action);
}classConnWatchDog implements Runnable{public voidrun(){try{
ServerSocket ss= new ServerSocket(port,5);while(running){
Socket s=ss.accept();new Thread(newSocketAction(s)).start();
}
}catch(IOException e) {
e.printStackTrace();
Server.this.stop();
}
}
}classSocketAction implements Runnable{
Socket s;
boolean run=true;long lastReceiveTime =System.currentTimeMillis();publicSocketAction(Socket s) {this.s =s;
}public voidrun() {while(running &&run){if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){
overThis();
}else{try{
InputStreamin =s.getInputStream();if(in.available()>0){
ObjectInputStream ois= new ObjectInputStream(in);
Object obj=ois.readObject();
lastReceiveTime=System.currentTimeMillis();
System.out.println("接收:\t"+obj);
ObjectAction oa= actionMapping.get(obj.getClass());
oa= oa==null?newDefaultObjectAction():oa;
Objectout =oa.doAction(obj);if(out!=null){
ObjectOutputStream oos= newObjectOutputStream(s.getOutputStream());
oos.writeObject(out);
oos.flush();
}
}else{
Thread.sleep(10);
}
}catch(Exception e) {
e.printStackTrace();
overThis();
}
}
}
}private voidoverThis() {if(run)run=false;if(s!=null){try{
s.close();
}catch(IOException e) {
e.printStackTrace();
}
}
System.out.println("關閉:"+s.getRemoteSocketAddress());
}
}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态