Java中的多线程回显服务器怎么利用套接字实现

  

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中的多线程回显服务器怎么利用套接字实现