Java中的多线程回显服务器怎么利用套接字实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
具体如下:
需要两个类,一个是EchoServer,代表服务器。另外一个是EchoServerClient,代表客户端。代码如下:
包面试; 进口java.io.BufferedReader; 进口java.io.IOException; 进口java.io.InputStreamReader; 进口java.io.PrintWriter; 进口java.net.ServerSocket; 进口java.net.Socket; 公开课EchoServer { 公共静态void main (String [] args)抛出IOException { 考察一下服务器=考察(6789); 而(真){ 套接字客户=server.accept ();=new ClientHandler ClientHandler处理程序(客户端); 新线程(处理器).start (); } } 公共静态类ClientHandler实现Runnable { 私人客户套接字; @Override 公共空间run () { InputStreamReader isr=零; 尝试{ isr=new InputStreamReader (client.getInputStream ()); BufferedReader br=new BufferedReader (isr); PrintWriter pw=new PrintWriter (client.getOutputStream ()); 字符串味精=br.readLine (); System.out.println(“收”到“+ client.getInetAddress() +“发送的“+味精); pw.println(“收到了你发的“+味精); pw.flush (); }捕捉(IOException e) { e.printStackTrace (); } } 公共ClientHandler(插座端){ 这一点。客户=客户; } } }
下面是客户端代码:
包面试; 进口java.io.BufferedReader; 进口java.io.IOException; 进口java.io.InputStreamReader; 进口java.io.PrintWriter; 进口java.net.Socket; 进口java.net.UnknownHostException; 进口java.util.Scanner; 公开课EchoServerClient { 公共静态void main (String [] args)抛出UnknownHostException, IOException { 套接字客户=新的套接字(“127.0.0.1", 6789); 扫描仪sc=new扫描仪(系统); System.out.print(“请输入要发送的内容:“); 字符串味精=sc.nextLine (); sc.close (); PrintWriter pw=new PrintWriter (client.getOutputStream ()); pw.println(味精); pw.flush (); InputStreamReader isr=new InputStreamReader (client.getInputStream ()); BufferedReader br=new BufferedReader (isr); System.out.println(“服务器返回:“+ br.readLine ()); client.close (); } }
NIO多路复用套接字方法如下:
包面试; 进口java.io.IOException; 进口java.net.InetSocketAddress; 进口java.nio.ByteBuffer; 进口java.nio.CharBuffer; 进口java.nio.channels.SelectionKey; 进口java.nio.channels.Selector; 进口java.nio.channels.ServerSocketChannel; 进口java.nio.channels.SocketChannel; 进口java.nio.charset.CharacterCodingException; 进口charset; 进口charsetdecoder; 进口charsetencoder; 进口java.util.Iterator; 公开课EchoServerNIO { 私有静态ServerSocketChannel serverChannel=零; 私有静态选择器选择器=零;//多路复用选择器 私有静态ByteBuffer缓冲=零;//缓冲区 公共静态void main (String [] args)抛出IOException { init (); 听(); } 静态孔隙init()抛出IOException { serverChannel=ServerSocketChannel.open (); 缓冲=ByteBuffer.allocate (1024); serverChannel.socket ()。绑定(新的InetSocketAddress (6789)); serverChannel.configureBlocking(假); 选择器=Selector.open (); serverChannel。注册(选择器,SelectionKey.OP_ACCEPT); } 静态空听()抛出IOException { 而(真){ 如果(selector.select (5000) !=0) { Iterator它=selector.selectedKeys () .iterator (); 而(it.hasNext ()) { SelectionKey关键=it.next (); 拔除(); handleKey(关键); } } } } 静态孔隙handleKey (SelectionKey键)抛出IOException { SocketChannel频道=零; 如果(key.isAcceptable ()) { ServerSocketChannel serverChannel=(ServerSocketChannel) key.channel (); 频道=serverChannel.accept (); channel.configureBlocking(假); 通道。注册(选择器,SelectionKey.OP_READ); }else if (key.isReadable ()) { 频道=(SocketChannel) key.channel (); buffer.clear (); 如果(channel.read(缓冲)比;0){ buffer.flip (); CharBuffer CharBuffer=CharsetHelper.decode(缓冲); 字符串味精=charBuffer.toString (); System.out.println(“收”到“+ channel.getRemoteAddress() +“的消息:“+味精); channel.write (CharsetHelper.encode (CharBuffer.wrap(“收到你味精:“;+味精))); } } } 公共静态类CharsetHelper { 私有静态最终字符串UTF_8=癠TF-8"; 私有静态CharsetEncoder编码器=Charset.forName (UTF_8) .newEncoder (); 私有静态CharsetDecoder解码器=Charset.forName (UTF_8) .newDecoder (); 私人CharsetHelper () { } 公共静态ByteBuffer编码(CharBuffer)抛出CharacterCodingException { 返回encoder.encode(的); } 公共静态CharBuffer解码(ByteBuffer)抛出CharacterCodingException { 返回decoder.decode(的); } } } Java中的多线程回显服务器怎么利用套接字实现