多线程Socket通信客户端/服务器

2024-03-06

我写完了一个客户端/服务器套接字通信程序,运行良好。现在我正在尝试弄清楚如何制作它,以便我可以同时与服务器建立多个客户端连接。我环顾四周,似乎有不止几种不同的方法可以做到这一点。所以我来这里向你们寻求帮助/建议。

我的服务器:

public class Server {
    private ServerSocket serverSocket = null;
    private Socket clientSocket = null;

    public Server() {
        try {
            serverSocket = new ServerSocket(7003);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 7003");
            System.exit(1);
        }

        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed");
            System.exit(1);
        }
    }

    public void startServer() throws IOException {
        PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        String inputLine, outputLine;

        outputLine = "Connected to Server";
        output.println(outputLine);

        while ((inputLine = input.readLine()) != null) {
            // This just determines users input and server ruturns output based on that

            outputLine = this.getServerOutput(inputLine);
            output.println(outputLine);

            if (outputLine.equals("Bye"))
                break;
        }

        output.close();
        input.close();
        clientSocket.close();
        serverSocket.close();
    }
}

我需要让我的构造函数创建线程并startServer()或者是我的运行方法?


你应该使用ExecutorService。您的客户请求处理将是run() of a Runnable每次接受后你可以打电话ExecutorService.submit(runnableTask)异步服务客户端。

使用 ExecutorService 的示例。

public class MyServer {

    private static MyServer server; 
    private ServerSocket serverSocket;

    /**
     * This executor service has 10 threads. 
     * So it means your server can process max 10 concurrent requests.
     */
    private ExecutorService executorService = Executors.newFixedThreadPool(10);        

    public static void main(String[] args) throws IOException {
        server = new MyServer();
        server.runServer();
    }

    private void runServer() {        
        int serverPort = 8085;
        try {
            System.out.println("Starting Server");
            serverSocket = new ServerSocket(serverPort); 

            while(true) {
                System.out.println("Waiting for request");
                try {
                    Socket s = serverSocket.accept();
                    System.out.println("Processing request");
                    executorService.submit(new ServiceRequest(s));
                } catch(IOException ioe) {
                    System.out.println("Error accepting connection");
                    ioe.printStackTrace();
                }
            }
        }catch(IOException e) {
            System.out.println("Error starting Server on "+serverPort);
            e.printStackTrace();
        }
    }

    //Call the method when you want to stop your server
    private void stopServer() {
        //Stop the executor service.
        executorService.shutdownNow();
        try {
            //Stop accepting requests.
            serverSocket.close();
        } catch (IOException e) {
            System.out.println("Error in server shutdown");
            e.printStackTrace();
        }
        System.exit(0);
    }

    class ServiceRequest implements Runnable {

        private Socket socket;

        public ServiceRequest(Socket connection) {
            this.socket = connection;
        }

        public void run() {

            //Do your logic here. You have the `socket` available to read/write data.

            //Make sure to close
            try {
                socket.close();
            }catch(IOException ioe) {
                System.out.println("Error closing client connection");
            }
        }        
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程Socket通信客户端/服务器 的相关文章

  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部

随机推荐

  • 扩展 TYPO3 femanager

    有人有一个如何在 TYPO3 8 7 上扩展 femanager 3 3 0 的工作示例吗 我创建了一个新的扩展来完成所有的事情 fe user TCA Partials 的新数据库字段 我在 femanager 插件中有新字段 可以为前端
  • 如何使用 numpy.all() 或 numpy.any()?

    我试图在 2D numpy 数组中搜索特定值 get above 方法返回字符 initial char 上方的坐标列表 def get above current wordsearch list of current coords get
  • 在Python函数中返回变量无法正常工作[重复]

    这个问题在这里已经有答案了 我一直在尝试在变量中返回函数中的变量并在其外部使用它 test 0 def testing test 1 return test testing print test 但是当我运行它时 结果是0 我该如何解决这个
  • SQLAlchemy 中是否有 LISTAGG Within GROUP 等效项?

    这是一个简单的 Oracle 表 food person pizza Adam pizza Bob pizza Charles ice cream Donald hamburger Emma hamburger Frank 以下是我想做的聚
  • numpy任意精度线性代数

    我有一个 numpy 2d 数组 中 大尺寸 比如说 500x500 我想找到它的元素指数的特征值 问题是某些值非常负 800 1000 等 并且它们的指数下溢 意味着它们非常接近零 因此 numpy 将它们视为零 无论如何可以在 nump
  • PHP_SELF 和 XSS

    我发现一篇文章声称 SERVER PHP SELF 容易受到 XSS 攻击 我不确定我是否理解正确 但我几乎可以肯定这是错误的 这怎么可能容易受到 XSS 攻击
  • 画布不绘制图像

    我只是想弄清楚如何在画布上绘制图像 我按照 W3 学校的教程进行操作 但是当我自己尝试时 它似乎不起作用 我将下面的代码复制并粘贴到 HTML 文件中 但图像从未加载到画布中 我将图片下载到同一目录中 我四处询问 上网查了一下 但似乎没有人
  • 使用 php 透视 html 表

    我有这个 php 代码 query production SELECT uploadedby as name sum points as points date format uploaddate Y m d as date FROM im
  • 保护非空单元格VBA

    我添加了 VBA 代码 双击时将时间或日期插入单元格 我设法让事情进展顺利 我正在努力解决的问题是在输入时间 日期后保护和锁定单元格 我已经到了这样的地步 当我双击 尝试编辑非空单元格时 我收到运行时错误 调试后 让我失望的行是 Targe
  • Android BLE 特性 getValue 在 API 级别 33 中已弃用,我获取该值的正确方法是什么?

    Android BLE 特性 getValue 在 API 级别 33 和developer android 中已弃用蓝牙Gatt特性 https developer android com reference android blueto
  • 在 Rmarkdown 中的参考书目后添加图形和表格

    我想在 R Markdown 文档中的参考书目后面添加表格和图形 但是 R Markdown 文档默认情况下始终将参考书目添加到报告的末尾 有没有一种简单的方法可以在参考文献之后添加内容到文档中 尝试的解决方案 A 之前的回答 https
  • 如何向 Exuberant Ctags 配置文件添加注释?

    我可以使用什么字符在 Exuberant Ctags 中发表评论 ctags file 我想添加注释和解释 也许还可以禁用一些正则表达式 但我找不到 ctags exuberant 接受的任何评论字符 我不断收到警告 ctags Warni
  • 我可以使用实体框架(模型优先)来生成组合键吗?

    我正在使用实体框架的 模型优先 方法设计一个数据库 基于我收到的反馈非常好 https stackoverflow com questions 4969133 database design problem在这里 我对数据库的一部分采用超类
  • Rmarkdown nocite 不显示 pdf 中的引用

    找到不起作用的方法是很困难的 我想使用nocite命令来显示我在文档中未引用的参考书目的条目 但我不明白为什么它不起作用 这是一个 MWE title Test date r format Sys time d B Y output pdf
  • Nodejs 使用 npm + package.json 解决依赖关系

    我的项目结构如下 index js package json node modules Service A main js package json Service B main js package json 当我做npm install
  • Android 5.1.1 及更高版本 - getRunningAppProcesses() 仅返回我的应用程序包

    看来谷歌终于关闭了获取当前前台应用程序包的所有大门 棒棒糖更新后 杀死了getRunningTasks int maxNum http developer android com intl zh cn reference android a
  • 如何检测网站是否无法通过 iframe 嵌入?

    我正在尝试在 iframe 中嵌入一些随机站点 我收到此错误 Refused to display document because display forbidden by X Frame Options 我愿意尊重他们的意愿而不嵌入它
  • 如何将JsDoc变成“混合”类型?

    简单的问题 如何记录 混合类型 我知道我可以列出所有可能的类型 例如 null undefined String Number Object 最终发现自己错过了一个并使其变得过于复杂 我尝试使用 Mixed 关键字 但它在许多 IDE 例如
  • JavaScript 性能? - 将事件放在html标签中,或者绑定它们?

    我想知道哪个性能更好 我有一个 网络应用程序 之类的东西 它有很多 javascript 单击按钮时 隐藏的 div 变得可见 这个新 div 有 5 个按钮 哪个对性能更好 1 将按钮点击事件放在每个按钮的 html 标签中 例如 onC
  • 多线程Socket通信客户端/服务器

    我写完了一个客户端 服务器套接字通信程序 运行良好 现在我正在尝试弄清楚如何制作它 以便我可以同时与服务器建立多个客户端连接 我环顾四周 似乎有不止几种不同的方法可以做到这一点 所以我来这里向你们寻求帮助 建议 我的服务器 public c