全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java基于Socket实现简单的多线程回显服务器功能示例

本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能。分享给大家供大家参考,具体如下:

需要两个类,一个是EchoServer,代表服务器。另外一个是EchoServerClient,代表客户端。代码如下:

package interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
  public static void main(String []args) throws IOException{
    ServerSocket server = new ServerSocket(6789);
    while(true){
      Socket client = server.accept();
      ClientHandler handler = new ClientHandler(client);
      new Thread(handler).start();
    }
  }
  public static class ClientHandler implements Runnable{
    private Socket client;
    @Override
    public void run() {
      InputStreamReader isr = null;
      try {
        isr = new InputStreamReader(client.getInputStream());
        BufferedReader br = new BufferedReader(isr);
        PrintWriter pw = new PrintWriter(client.getOutputStream());
        String msg = br.readLine();
        System.out.println("收到" + client.getInetAddress() + "发送的" + msg);
        pw.println("收到了你发的" + msg);
        pw.flush();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    public ClientHandler(Socket client){
      this.client = client;
    }
  }
}

下面是客户端代码:

package interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class EchoServerClient {
  public static void main(String []args) throws UnknownHostException, IOException{
    Socket client = new Socket("127.0.0.1", 6789);
    Scanner sc = new Scanner(System.in);
    System.out.print("请输入要发送的内容:");
    String msg = sc.nextLine();
    sc.close();
    PrintWriter pw = new PrintWriter(client.getOutputStream());
    pw.println(msg);
    pw.flush();
    InputStreamReader isr = new InputStreamReader(client.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    System.out.println("服务器返回:" + br.readLine());
    client.close();
  }
}

NIO多路复用套接字方法如下:

package interview;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
public class EchoServerNIO {
  private static ServerSocketChannel serverChannel = null;
  private static Selector selector = null;// 多路复用选择器
  private static ByteBuffer buffer = null;  // 缓冲区
  public static void main(String []args) throws IOException{
    init();
    listen();
  }
  static void init() throws IOException{
    serverChannel = ServerSocketChannel.open();
    buffer = ByteBuffer.allocate(1024);
    serverChannel.socket().bind(new InetSocketAddress(6789));
    serverChannel.configureBlocking(false);
    selector = Selector.open();
    serverChannel.register(selector, SelectionKey.OP_ACCEPT);
  }
  static void listen() throws IOException{
    while(true){
      if(selector.select(5000) != 0){
        Iterator<SelectionKey> it = selector.selectedKeys().iterator();
        while(it.hasNext()){
          SelectionKey key = it.next();
          it.remove();
          handleKey(key);
        }
      }
    }
  }
  static void handleKey(SelectionKey key) throws IOException{
    SocketChannel channel = null;
    if(key.isAcceptable()){
      ServerSocketChannel serverChannel = (ServerSocketChannel)key.channel();
      channel = serverChannel.accept();
      channel.configureBlocking(false);
      channel.register(selector, SelectionKey.OP_READ);
    }else if(key.isReadable()){
      channel = (SocketChannel)key.channel();
      buffer.clear();
      if(channel.read(buffer) > 0){
        buffer.flip();
        CharBuffer charBuffer = CharsetHelper.decode(buffer);
        String msg = charBuffer.toString();
        System.out.println("收到" + channel.getRemoteAddress() + "的消息:" + msg);
        channel.write(CharsetHelper.encode(CharBuffer.wrap("received your msg:" + msg)));
      }
    }
  }
  public static class CharsetHelper{
    private static final String UTF_8 = "UTF-8";
    private static CharsetEncoder encoder = Charset.forName(UTF_8).newEncoder();
    private static CharsetDecoder decoder = Charset.forName(UTF_8).newDecoder();
    private CharsetHelper() {
    }
    public static ByteBuffer encode(CharBuffer in) throws CharacterCodingException{
      return encoder.encode(in);
    }
    public static CharBuffer decode(ByteBuffer in) throws CharacterCodingException{
      return decoder.decode(in);
    }
  }
}

更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


# Java  # Socket  # 多线程  # 回显  # 服务器  # Java实现基于NIO的多线程Web服务器实例  # java使用socket实现一个多线程web服务器的方法  # Java编程实现多线程TCP服务器完整实例  # Java编程利用socket多线程访问服务器文件代码示例  # java多线程实现服务器端与多客户端之间的通信  # Java多线程实现聊天客户端和服务器  # Java创建多线程服务器流程  # 多路  # 复用  # 客户端  # 操作技巧  # 相关内容  # 感兴趣  # 数据结构  # 给大家  # 请输入  # 另外一个  # 收到了  # 更多关于  # 所述  # 程序设计  # 方法如下  # 选择器  # 编程技巧  # 讲述了  # Override 


相关文章: c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  C#如何使用XPathNavigator高效查询XML  宝塔面板创建网站无法访问?如何快速排查修复?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  专业公司网站制作公司,用什么语言做企业网站比较好?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  电商网站制作公司有哪些,1688网是什么意思?  如何使用Golang安装API文档生成工具_快速生成接口文档  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何用VPS主机快速搭建个人网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何在景安云服务器上绑定域名并配置虚拟主机?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  网站图片在线制作软件,怎么在图片上做链接?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网站制作服务平台,有什么网站可以发布本地服务信息?  移民网站制作流程,怎么看加拿大移民官网?  如何快速使用云服务器搭建个人网站?  制作销售网站教学视频,销售网站有哪些?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  如何在万网自助建站平台快速创建网站?  详解jQuery中基本的动画方法  常州自助建站工具推荐:低成本搭建与模板选择技巧  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  制作网站的模板软件,网站怎么建设?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何挑选高效建站主机与优质域名?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  内网网站制作软件,内网的网站如何发布到外网?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  用v-html解决Vue.js渲染中html标签不被解析的问题  如何设置并定期更换建站之星安全管理员密码?  建站之星后台管理如何实现高效配置?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  建站之星展会模版如何一键下载生成?  代刷网站制作软件,别人代刷火车票靠谱吗?  免费视频制作网站,更新又快又好的免费电影网站?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何基于PHP生成高效IDC网络公司建站源码?  建站之星在线版空间:自助建站+智能模板一键生成方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。