socket编程 android

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Androidsocket编程以非阻塞I/O服务器及Service为例介绍Socket通信,有两个不足的地方,1.服务器会造成IO的阻塞即服务器一旦执行server.accept();将一直处于阻塞状态,直到有客户端请求连接。2.服务器端没有建立用户列表,无法将某一客户端发送的消息广播给所有正在连接的客户端。就好象是一个人自说自话,自己发送给客户端,自己接收服务器返回的消息。基于以上两点,我改进了我的程序。服务器端的改进:1.通过采用socketchannel的非阻塞方式进行通信2.建立Userlist客户端的哈希表,存储已连接客户端的ip地址和服务器为其分发的socketchannel客户端的改进:1.采用Service与服务器端进行连接,发送数据,实时监听服务器返回的数据。流程图:需要改进的地方服务器端:1.当一个客户端断开连接以后,另一个客户端在收到消息之前也断开连接,而此时服务器正在向客户端发送消息,因此,服务器的Thread.sleep时间不能太长,但也不能太短,因为考虑到服务器的负荷问题。2.服务器容错处理机制需要改进。客户端:1.将Notificationbar改为其他更为直观方式刷新显示。2.容错处理机制的处理。下面是效果图:服务器端:dos客户端:Android客户端:效果图的意思是,Android的客户端通过绑定Service与服务器端进行了连接,并发送消息。服务器向所有正在连接的客户端广播消息。之后,Dos终端也进行连接,并发送消息,服务器接到消息后向所有正在连接的客户端广播消息(其中包括在线的android手机)第1页第2页第3页第4页第5页第6页之前采用聊天敲门的方式来介绍Socket通信,有两个不足的地方,1.服务器会造成IO的阻塞即服务器一旦执行server.accept();将一直处于阻塞状态,直到有客户端请求连接。2.服务器端没有建立用户列表,无法将某一客户端发送的消息广播给所有正在连接的客户端。就好象是一个人自说自话,自己发送给客户端,自己接收服务器返回的消息。基于以上两点,我改进了我的程序。服务器端的改进:1.通过采用socketchannel的非阻塞方式进行通信2.建立Userlist客户端的哈希表,存储已连接客户端的ip地址和服务器为其分发的socketchannel客户端的改进:1.采用Service与服务器端进行连接,发送数据,实时监听服务器返回的数据。流程图:需要改进的地方服务器端:1.当一个客户端断开连接以后,另一个客户端在收到消息之前也断开连接,而此时服务器正在向客户端发送消息,因此,服务器的Thread.sleep时间不能太长,但也不能太短,因为考虑到服务器的负荷问题。2.服务器容错处理机制需要改进。客户端:1.将Notificationbar改为其他更为直观方式刷新显示。2.容错处理机制的处理。下面是效果图:服务器端:dos客户端:Android客户端:效果图的意思是,Android的客户端通过绑定Service与服务器端进行了连接,并发送消息。服务器向所有正在连接的客户端广播消息。之后,Dos终端也进行连接,并发送消息,服务器接到消息后向所有正在连接的客户端广播消息(其中包括在线的android手机)第1页第2页第3页第4页第5页第6页接上页源代码如下:Server端:packagecom.android.Yao;importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjava.net.*;importjava.util.*;importjava.nio.charset.*;importjava.lang.*;publicclassYaoChatServer{publicSelectorsel=null;publicServerSocketChannelserver=null;publicSocketChannelsocket=null;publicintthisport=4900;privateStringresult=null;privateHashtableuserlists;privateSocketChannelreadingsocket=null;publicYaoChatServer(){System.out.println(Insidestartserver);}publicYaoChatServer(intport){System.out.println(Insidestartserver);thisport=port;}publicvoidinitializeOperations()throwsIOException,UnknownHostException{System.out.println(Insideinitialization);sel=Selector.open();server=ServerSocketChannel.open();server.configureBlocking(false);InetAddressia=InetAddress.getLocalHost();InetSocketAddressisa=newInetSocketAddress(ia,thisport);server.socket().bind(isa);userlists=newHashtable();}publicvoidstartServer()throwsIOException{initializeOperations();server.register(sel,SelectionKey.OP_ACCEPT);while(sel.select()0){SetreadyKeys=sel.selectedKeys();Iteratorit=readyKeys.iterator();while(it.hasNext()){SelectionKeykey=(SelectionKey)it.next();it.remove();if(key.isAcceptable()){ServerSocketChannelssc=(ServerSocketChannel)key.channel();socket=(SocketChannel)ssc.accept();socket.configureBlocking(false);Stringsocketname=socket.socket().getRemoteSocketAddress().toString();socket.register(sel,SelectionKey.OP_WRITE);userlists.put(socketname,socket);System.out.println(socketname+isconnected!);}if(key.isWritable()){readingsocket=(SocketChannel)key.channel();Stringret=readMessage(readingsocket);if(ret.equalsIgnoreCase(@@@@@isgoingtosaygoodbye!)){key.cancel();readingsocket.close();userlists.remove(readingsocket.socket().getRemoteSocketAddress().toString());System.out.println(sendservermsg:+ret.replace(@@@@@,readingsocket.socket().getRemoteSocketAddress().toString()));sendMessage(ret.replace(@@@@@,readingsocket.socket().getRemoteSocketAddress().toString()));}elseif(ret.length()0){System.out.println(sendservermsg:+ret);sendMessage(ret);}}}}}publicvoidsendMessage(Stringmsg)throwsIOException{ByteBufferbuffer=ByteBuffer.allocate(1024);buffer=ByteBuffer.wrap(msg.getBytes());//ByteBufferbuffer=ByteBuffer.wrap(msg.getBytes(UTF-8));Collectionchannels=userlists.values();SocketChannelsc;for(Objecto:channels){sc=(SocketChannel)o;sc.write(buffer);buffer.flip();try{Thread.sleep(500);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}publicStringreadMessage(SocketChannelsc){intnBytes=0;ByteBufferbuf=ByteBuffer.allocate(1024);try{nBytes=sc.read(buf);buf.flip();Charsetcharset=Charset.forName(UTF-8);CharsetDecoderdecoder=charset.newDecoder();CharBuffercharBuffer=decoder.decode(buf);result=charBuffer.toString();}catch(IOExceptione){result=@@@@@isgoingtosaygoodbye!;}returnresult;}publicstaticvoidmain(Stringargs[]){YaoChatServernb=newYaoChatServer();try{nb.startServer();}catch(IOExceptione){e.printStackTrace();System.exit(-1);}}}Android客户端的Service类:packagecom.android.Yao;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.CharBuffer;importjava.nio.channels.SocketChannel;importjava.nio.charset.CharacterCodingException;importjava.nio.charset.Charset;importjava.nio.charset.CharsetDecoder;importjava.util.Collection;importandroid.app.Notification;importandroid.app.NotificationManager;importandroid.app.PendingIntent;importandroid.app.Service;importandroid.content.Context;importandroid.content.Intent;importandroid.os.Binder;importandroid.os.IBinder;publicclassReceiveMessage

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功