上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后 等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。具体代码如下:

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.test.socket.sample2;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. public class MyServer {
  9. public static void main(String[] args) throws IOException {
  10. ServerSocket server = new ServerSocket(10000);
  11. while (true) {
  12. Socket socket = server.accept();
  13. invoke(socket);
  14. }
  15. }
  16. private static void invoke(final Socket client) throws IOException {
  17. new Thread(new Runnable() {
  18. public void run() {
  19. BufferedReader in = null;
  20. PrintWriter out = null;
  21. try {
  22. in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  23. out = new PrintWriter(client.getOutputStream());
  24. while (true) {
  25. String msg = in.readLine();
  26. System.out.println(msg);
  27. out.println("Server received " + msg);
  28. out.flush();
  29. if (msg.equals("bye")) {
  30. break;
  31. }
  32. }
  33. } catch(IOException ex) {
  34. ex.printStackTrace();
  35. } finally {
  36. try {
  37. in.close();
  38. } catch (Exception e) {}
  39. try {
  40. out.close();
  41. } catch (Exception e) {}
  42. try {
  43. client.close();
  44. } catch (Exception e) {}
  45. }
  46. }
  47. }).start();
  48. }
  49. }

下面是Client程序代码:

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.test.socket.sample2;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. public class MyClient {
  7. public static void main(String[] args) throws Exception {
  8. Socket socket = new Socket("localhost", 10000);
  9. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  10. PrintWriter out = new PrintWriter(socket.getOutputStream());
  11. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  12. while (true) {
  13. String msg = reader.readLine();
  14. out.println(msg);
  15. out.flush();
  16. if (msg.equals("bye")) {
  17. break;
  18. }
  19. System.out.println(in.readLine());
  20. }
  21. socket.close();
  22. }
  23. }

测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。

转载于:https://www.cnblogs.com/roycl/articles/4199017.html

[转载]Java Socket实战之二 多线程通信相关推荐

  1. Java Socket实战之一:单线程通信

    转自:http://developer.51cto.com/art/201202/317543.htm 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用sprin ...

  2. Java Socket实战之六 使用NIO包实现Socket通信

    2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7288896 Java S ...

  3. Java Socket实战之四 传输压缩对象

    2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7259834 Java S ...

  4. Java Socket实战之三:传输对象

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...

  5. [置顶] Java Socket实战之一 单线程通信

    本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可 ...

  6. Java Socket实现简单的即时通信

    一.项目简述 这是一个即时通信软件的简单实现,通过自定义协议实现登录.退出等控制命令,即时通信软件需要有服务器端与客户端. 二.自定义协议 1.Protocol协议实体类,封装了消息类型以及发送消息. ...

  7. Java Socket实战之五:使用加密协议传输对象

    转自:http://developer.51cto.com/art/201202/317547.htm 前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据 ...

  8. java socket 全双工客户端_JavaSocket全双工通信 问题 待解决

    之前发了一个JavaSocket全双工通信的随笔,今天又看了一边之后发现了很多问题,于是决定重新写一下 写的途中遇到了个问题客户端在等待键盘写入的时候如果服务器下发了下线指令(exit),只有客户端键 ...

  9. java通信项目_Java项目中的多线程通信如何利用Socket实现

    Java项目中的多线程通信如何利用Socket实现 发布时间:2020-11-24 16:44:40 来源:亿速云 阅读:96 作者:Leah 这期内容当中小编将会给大家带来有关Java项目中的多线程 ...

最新文章

  1. STM32F4 HAL库开发 -- SPI Flash
  2. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和
  3. 工作总结3:axios里面的主要参数
  4. 自顶向下和自底向上测试的优缺点
  5. 读中文_校友分享预告 | 在港中文读物理是什么体验?理科就业转商科有何经验心得?...
  6. 大型数据库的设计原则与开发技巧
  7. 【网络拥塞管理和避免(队列调度算法FIFO/SP/RR/WRR/DRR/MDRR/WDRR/WFQ)】
  8. 探究 Spring 的定时任务配置
  9. CentOS系统时间与网络同步
  10. 手机开热点但是电脑一直连接不上_电脑无法连接手机开的热点怎么解决
  11. 怎么用软件测试相似相似度,文档相似性检测工具
  12. PHP解密PHP加密sg11加密sg11解密全网最厚道的SG11解密方法sg11解密 php解密 SourceGuardian解密sg_load解密去除域名IP授权
  13. 华为云怎么修改服务器密码,云服务器登陆密码如何修改
  14. 康托尔悖论:大全集不存在,即包含一切集合的集合是否存在
  15. 南京大学学生用7000张照片算出院系“平均脸”
  16. this is related to npm not being able to find a file
  17. Docker:从入门到入门
  18. 94608000秒,1576800分,26280小时,1095天!!
  19. Ascent代码分析4-World之地图管理及实现结构
  20. 2022CTF培训(十一)IOT 相关 CVE 漏洞分析

热门文章

  1. 通向财务自由之路05_选择一个有效的理念
  2. 《美团数据平台及数仓建设实践》(209页).PDF
  3. 结构化思维:掌握这3点,分析报告不再愁
  4. 阿里年薪80w数据总监分享:一张图了解数据分析完整流程
  5. 让数据可视化告诉你,中秋吃这样的月饼绝对没错
  6. 你可以不懂数据分析,但请一定收藏这个神器!
  7. 数据分析学习笔记——Pandas库思维导图
  8. 不属于python数据类型的是_python基础3 ---python数据类型二
  9. php与mysqli,如何通过PHP与MySQLi保持联系
  10. php更新不了数据库,为什么我不能使用PHP编辑/更新数据库?