Java基于Socket实现简单的多线程回显服务器功能示例
本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能。分享给大家供大家参考,具体如下:
需要两个类,一个是EchoServer,代表服务器。另外一个是EchoServerClient,代表客户端。代码如下:
packageinterview; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.ServerSocket; importjava.net.Socket; publicclassEchoServer{ publicstaticvoidmain(String[]args)throwsIOException{ ServerSocketserver=newServerSocket(6789); while(true){ Socketclient=server.accept(); ClientHandlerhandler=newClientHandler(client); newThread(handler).start(); } } publicstaticclassClientHandlerimplementsRunnable{ privateSocketclient; @Override publicvoidrun(){ InputStreamReaderisr=null; try{ isr=newInputStreamReader(client.getInputStream()); BufferedReaderbr=newBufferedReader(isr); PrintWriterpw=newPrintWriter(client.getOutputStream()); Stringmsg=br.readLine(); System.out.println("收到"+client.getInetAddress()+"发送的"+msg); pw.println("收到了你发的"+msg); pw.flush(); }catch(IOExceptione){ e.printStackTrace(); } } publicClientHandler(Socketclient){ this.client=client; } } }
下面是客户端代码:
packageinterview; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.Socket; importjava.net.UnknownHostException; importjava.util.Scanner; publicclassEchoServerClient{ publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{ Socketclient=newSocket("127.0.0.1",6789); Scannersc=newScanner(System.in); System.out.print("请输入要发送的内容:"); Stringmsg=sc.nextLine(); sc.close(); PrintWriterpw=newPrintWriter(client.getOutputStream()); pw.println(msg); pw.flush(); InputStreamReaderisr=newInputStreamReader(client.getInputStream()); BufferedReaderbr=newBufferedReader(isr); System.out.println("服务器返回:"+br.readLine()); client.close(); } }
NIO多路复用套接字方法如下:
packageinterview; importjava.io.IOException; importjava.net.InetSocketAddress; importjava.nio.ByteBuffer; importjava.nio.CharBuffer; importjava.nio.channels.SelectionKey; importjava.nio.channels.Selector; importjava.nio.channels.ServerSocketChannel; importjava.nio.channels.SocketChannel; importjava.nio.charset.CharacterCodingException; importjava.nio.charset.Charset; importjava.nio.charset.CharsetDecoder; importjava.nio.charset.CharsetEncoder; importjava.util.Iterator; publicclassEchoServerNIO{ privatestaticServerSocketChannelserverChannel=null; privatestaticSelectorselector=null;//多路复用选择器 privatestaticByteBufferbuffer=null;//缓冲区 publicstaticvoidmain(String[]args)throwsIOException{ init(); listen(); } staticvoidinit()throwsIOException{ serverChannel=ServerSocketChannel.open(); buffer=ByteBuffer.allocate(1024); serverChannel.socket().bind(newInetSocketAddress(6789)); serverChannel.configureBlocking(false); selector=Selector.open(); serverChannel.register(selector,SelectionKey.OP_ACCEPT); } staticvoidlisten()throwsIOException{ while(true){ if(selector.select(5000)!=0){ Iteratorit=selector.selectedKeys().iterator(); while(it.hasNext()){ SelectionKeykey=it.next(); it.remove(); handleKey(key); } } } } staticvoidhandleKey(SelectionKeykey)throwsIOException{ SocketChannelchannel=null; if(key.isAcceptable()){ ServerSocketChannelserverChannel=(ServerSocketChannel)key.channel(); channel=serverChannel.accept(); channel.configureBlocking(false); channel.register(selector,SelectionKey.OP_READ); }elseif(key.isReadable()){ channel=(SocketChannel)key.channel(); buffer.clear(); if(channel.read(buffer)>0){ buffer.flip(); CharBuffercharBuffer=CharsetHelper.decode(buffer); Stringmsg=charBuffer.toString(); System.out.println("收到"+channel.getRemoteAddress()+"的消息:"+msg); channel.write(CharsetHelper.encode(CharBuffer.wrap("receivedyourmsg:"+msg))); } } } publicstaticclassCharsetHelper{ privatestaticfinalStringUTF_8="UTF-8"; privatestaticCharsetEncoderencoder=Charset.forName(UTF_8).newEncoder(); privatestaticCharsetDecoderdecoder=Charset.forName(UTF_8).newDecoder(); privateCharsetHelper(){ } publicstaticByteBufferencode(CharBufferin)throwsCharacterCodingException{ returnencoder.encode(in); } publicstaticCharBufferdecode(ByteBufferin)throwsCharacterCodingException{ returndecoder.decode(in); } } }
更多关于java相关内容感兴趣的读者可查看本站专题:《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。