java socket实战.docx
- 文档编号:8192816
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:26
- 大小:19.27KB
java socket实战.docx
《java socket实战.docx》由会员分享,可在线阅读,更多相关《java socket实战.docx(26页珍藏版)》请在冰豆网上搜索。
javasocket实战
一直没时间继续写,这两天总算找了点时间把当时的一些想法简单实现了一下,比较初略,主要是记下自己的想法,下次有机会了再慢慢细化吧。
对于Socket编程来说,通常我们遇到的最大的麻烦就是要定义自己的协议,用来在server端和client端处理请求和响应,当socket处理的请求对象越来越多以后,如果规则定义不清楚就会导致代码急剧膨胀,并且维护性变差,所以这里我想了一个简单的方式来处理这种情况。
下面大概说一下我的想法
1.首先会有几个和业务相关的类,User,MyUserService和MyUserServiceImpl。
User就是我们通常的实体类;MyUserService是我们针对User实体类提供的业务逻辑接口,比较简单就写了三个方法;MyUserServiceImpl是业务逻辑实现类。
User.java
[java]
packagecom.googlecode.garbagecan.test.socket.sample10;
publicclassUserimplementsjava.io.Serializable{
privatestaticfinallongserialVersionUID=1L;
privateStringname;
privateStringpassword;
publicUser(){
}
publicUser(Stringname,Stringpassword){
this.name=name;
this.password=password;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
MyUserService.java
[java]
packagecom.googlecode.garbagecan.test.socket.sample10;
importjava.util.List;
publicinterfaceMyUserService{
List
UserfindByName(Stringname);
voidtest();
}
MyUserServiceImpl.java
[java]
packagecom.googlecode.garbagecan.test.socket.sample10;
importjava.util.ArrayList;
importjava.util.List;
publicclassMyUserServiceImplimplementsMyUserService{
@Override
publicList
List
for(inti=0;i users.add(newUser("user_"+i,"password_"+i)); } returnusers; } @Override publicUserfindByName(Stringname){ returnnewUser(name,null); } @Override publicvoidtest(){ //donothing } } 2.服务器端类,主要有三个类MyServer,MyServerSimpleImpl和MyServerNIOImpl。 MyServer是服务器端接口类,用来启动Socketserver;MyServerSimpleImpl和MyServerNIOImpl是两个实现类,其中MyServerSimpleImpl是使用简单的Socket实现的,MyServerNIOImpl是使用javanio包里的类实现的,这个实现会有更好的性能。 MyServer.java [java] packagecom.googlecode.garbagecan.test.socket.sample10; publicinterfaceMyServer{ publicvoidstartup()throwsException; publicvoidshutdown()throwsException; } MyServerSimpleImpl.java [java] packagecom.googlecode.garbagecan.test.socket.sample10; importcom.googlecode.garbagecan.test.socket.IOUtil; importjava.io.ObjectInputStream; importjava.io.ObjectOutputStream; importjava.lang.reflect.Method; import.ServerSocket; import.Socket; publicclassMyServerSimpleImplimplementsMyServer{ privateintport; publicMyServerSimpleImpl(intport){ this.port=port; } publicvoidstartup()throwsException{ newThread(newRunnable(){ @Override publicvoidrun(){ try{ ServerSocketserver=newServerSocket(port); while(true){ Socketsocket=server.accept(); invoke(socket); } }catch(Exceptionex){ ex.printStackTrace(); } } }).start(); } @Override publicvoidshutdown()throwsException{ //Implementme } privatevoidinvoke(finalSocketsocket){ newThread(newRunnable(){ publicvoidrun(){ ObjectInputStreamois=null; ObjectOutputStreamoos=null; try{ ois=newObjectInputStream(socket.getInputStream()); oos=newObjectOutputStream(socket.getOutputStream()); Objectobj=ois.readObject(); MyRequestrequest=(MyRequest)obj; MyResponseresponse=execute(request); oos.writeObject(response); oos.flush(); }catch(Exceptionex){ ex.printStackTrace(); }finally{ IOUtil.closeQuietly(ois); IOUtil.closeQuietly(oos); IOUtil.closeQuietly(socket); } } }).start(); } privateMyResponseexecute(MyRequestrequest)throwsException{ Classclazz=request.getRequestClass(); StringmethodName=request.getRequestMethod(); Class >[]parameterTypes=request.getRequestParameterTypes(); Methodmethod=clazz.getDeclaredMethod(methodName,parameterTypes); Object[]parameterValues=request.getRequestParameterValues(); finalObjectobj=method.invoke(clazz.newInstance(),parameterValues); returnnewMyGenericResponse(obj); } } MyServerNIOImpl.java [java] packagecom.googlecode.garbagecan.test.socket.sample10; importcom.googlecode.garbagecan.test.socket.SerializableUtil; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.lang.reflect.Method; import.InetSocketAddress; importjava.nio.ByteBuffer; importjava.nio.channels.SelectionKey; importjava.nio.channels.Selector; importjava.nio.channels.ServerSocketChannel; importjava.nio.channels.SocketChannel; importjava.util.Iterator; importjava.util.logging.Level; importjava.util.logging.Logger; publicclassMyServerNIOImplimplementsMyServer{ privatefinalstaticLoggerlogger=Logger.getLogger(MyServerNIOImpl.class.getName()); privateintport; publicMyServerNIOImpl(intport){ this.port=port; } publicvoidstartup()throwsException{ newThread(newRunnable(){ @Override publicvoidrun(){ Selectorselector=null; ServerSocketChannelserverSocketChannel=null; try{ selector=Selector.open(); serverSocketChannel=ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.socket().setReuseAddress(true); serverSocketChannel.socket().bind(newInetSocketAddress(port)); serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT); while(selector.select()>0){ try{ Iterator while(it.hasNext()){ SelectionKeyreadyKey=it.next(); it.remove(); invoke((ServerSocketChannel)readyKey.channel()); } }catch(Exceptionex){ logger.log(Level.SEVERE,ex.getMessage(),ex); } } }catch(Exceptionex){ logger.log(Level.SEVERE,ex.getMessage(),ex); }finally{ try{ selector.close(); }catch(Exceptionex){} try{ serverSocketChannel.close(); }catch(Exceptionex){} } } }).start(); } @Override publicvoidshutdown()throwsException{ //Implementme } privatevoidinvoke(ServerSocketChannelserverSocketChannel)throwsException{ SocketChannelsocketChannel=null; try{ socketChannel=serverSocketChannel.accept(); MyRequestmyRequest=receiveData(socketChannel); MyResponsemyResponse=execute(myRequest); sendData(socketChannel,myResponse); }finally{ try{ socketChannel.close(); }catch(Exceptionex){} } } privateMyResponseexecute(MyRequestrequest)throwsException{ Classclazz=request.getRequestClass(); StringmethodName=request.getRequestMethod(); Class >[]parameterTypes=request.getRequestParameterTypes(); Methodmethod=clazz.getDeclaredMethod(methodName,parameterTypes); Object[]parameterValues=request.getRequestParameterValues(); finalObjectobj=method.invoke(clazz.newInstance(),parameterValues); returnnewMyGenericResponse(obj); } privateMyRequestreceiveData(SocketChannelsocketChannel)throwsIOException{ MyRequestmyRequest=null; ByteArrayOutputStreambaos=newByteArrayOutputStream(); ByteBufferbuffer=ByteBuffer.allocate(1024); try{ byte[]bytes; intsize=0; while((size=socketChannel.read(buffer))>=0){ buffer.flip(); bytes=newbyte[size]; buffer.get(bytes); baos.write(bytes); buffer.clear(); } bytes=baos.toByteArray();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java socket实战 socket 实战