出处:http://blog.csdn.net/tuzongxun

接《java Socket实现简单在线聊天(一)》,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程。每当有一个新的客户端连接上来,服务端便需要新启动一个线程进行处理,从而解决之前的循环读取中造成阻塞的问题。

写线程通常有两种方法,集成Thread或者实现runnable接口,原则上是能实现runnable的情况下就不继承,因为实现接口的方式更加灵活。
客户端代码相较之前没有变化,变得是服务端,因此这里便只贴出服务端代码:
[java] view plain copy
  1. package chat.chat;
  2. import java.io.DataInputStream;
  3. import java.io.EOFException;
  4. import java.io.IOException;
  5. import java.net.BindException;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.net.SocketException;
  9. /**
  10. * java使用socket和awt组件以及多线程简单实现在线聊天功能服务端 : 实现多个客户端连接后不断向服务端发送消息,
  11. * 相对于第一个版本,重点在于使用了多线程。服务端还未实现转发功能,客户端图形窗口中只能看到自己输入的信息, 不能看到其他客户端发送的消息
  12. *
  13. * @author tuzongxun123
  14. *
  15. */
  16. public class ChatServer {
  17. public static void main(String[] args) {
  18. new ChatServer().start();
  19. }
  20. // 是否成功启动服务端
  21. private boolean isStart = false;
  22. // 服务端socket
  23. private ServerSocket ss = null;
  24. // 客户端socket
  25. private Socket socket = null;
  26. public void start() {
  27. try {
  28. // 启动服务器
  29. ss = new ServerSocket(8888);
  30. } catch (BindException e) {
  31. System.out.println("端口已在使用中");
  32. // 关闭程序
  33. System.exit(0);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. try {
  38. isStart = true;
  39. while (isStart) {
  40. // 启动监听
  41. socket = ss.accept();
  42. System.out.println("one client connect");
  43. // 启动客户端线程
  44. Client client = new Client(socket);
  45. new Thread(client).start();
  46. }
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. } finally {
  50. // 关闭服务
  51. try {
  52. ss.close();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. /**
  59. * 客户端线程
  60. *
  61. * @author tuzongxun123
  62. *
  63. */
  64. class Client implements Runnable {
  65. // 客户端socket
  66. private Socket socket = null;
  67. // 客户端输入流
  68. private DataInputStream dataInputStream = null;
  69. private boolean isConnect = false;
  70. public Client(Socket socket) {
  71. this.socket = socket;
  72. try {
  73. isConnect = true;
  74. // 获取客户端输入流
  75. dataInputStream = new DataInputStream(socket.getInputStream());
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. @Override
  81. public void run() {
  82. isConnect = true;
  83. try {
  84. while (isConnect) {
  85. // 读取客户端传递的数据
  86. String message = dataInputStream.readUTF();
  87. System.out.println("客户端说:" + message);
  88. }
  89. } catch (EOFException e) {
  90. System.out.println("client closed!");
  91. } catch (SocketException e) {
  92. System.out.println("Client is Closed!!!!");
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. } finally {
  96. // 关闭相关资源
  97. try {
  98. dataInputStream.close();
  99. socket.close();
  100. } catch (IOException e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. }
  105. }
  106. }

转载于:https://www.cnblogs.com/Simeonwu/p/7601406.html

java Socket实现简单在线聊天(二)相关推荐

  1. 在线聊天JAVA后端_java web 在线聊天的基本实现

    随着互联网的发展,http的协议有些时候不能满足需求,比如在现聊天的实现.如果使用http协议必须轮训,或者使用长链接.必须要一个request,这样后台才能发送信息到前端. 后台不能主动找客户端通信 ...

  2. java socket多人聊天室_如何运用Java socket实现多人聊天室功能

    如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...

  3. java socket多人聊天_如何运用Java socket实现多人聊天室功能

    导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...

  4. 基于Server-Sent Event的简单在线聊天室

    一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览 ...

  5. 一个基于 Spring Cloud + Vue + Socket.IO 的在线聊天网站,不来体验一下吗?

    前言 2022年8月1日,经过一系列的准备工作,这个充满 BUG 的神奇网站在今天发布上线了.因为网站目前的主要功能是在线聊天,所以暂且就先叫它 EasyChat 吧. EasyChat 是一个可以在 ...

  6. c语言socket调用图灵API,socket通信(四):socket实现机器人在线聊天

    实现思路:客户端(本机)向服务端发送消息:服务端接收消息,并调用图灵机器人API接口,获取回复返回给客户端. 首先需要先去图灵机器人http://www.tuling123.com申请帐号,并创建机器 ...

  7. 基于Java语言的Web在线聊天室

    在线聊天室 能够实现登录,注册,聊天功能,最终效果如下图所示 注册页面 <%@ page language="java" contentType="text/htm ...

  8. Java TCP实现高仿版QQ聊天(二)

    前言 ​ 这是在上一篇博客基础上开展的,第一部分我们只实现了本机的聊天,无法将程序放置另外机器上和本机进行聊天.这篇博客我将介绍如何实现不同机器之间实现聊天,达到真正意义上的聊天.不过这篇博客在其他机 ...

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

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

最新文章

  1. [Core Java® for the Impatient]重载Java2
  2. 开源的javascript实现页面打印功能,兼容所有的浏览器(情况属实)
  3. Dataset之AllstateClaimsSeverity:AllstateClaimsSeverity数据集(Kaggle2016竞赛)的简介、下载、案例应用之详细攻略
  4. spring-security认证授权
  5. python核心,内建函数,高阶函数
  6. R语言中dim函数_R语言--向量化计算(apply族函数)
  7. atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
  8. 应用层DNS:域名系统(DNS:Domain Name Systems)
  9. esxi vsphere的端口_硬干货!一张图弄清楚在ESXi下如何进行网络抓包
  10. 需要使用Git branch switch 的情况Git stash的使用时机
  11. 红帽子linux改ip命令,Linux系统下图形界面更改IP地址
  12. Mac/Ubuntu/Windows使用VNC Viewer远程控制Ubuntu Server
  13. centos nginx php5.3,centos6.2+nginx-1.2.3+php-5.3.17装配脚本
  14. CSS z-index 属性 控制div上下层次
  15. 有限差分法解NS方程原理
  16. 基于单片机的无线病房呼叫系统设计
  17. 【译】设计师不可不知的八大网页动画设计
  18. 【历史上的今天】6 月 6 日:世界 IPv6 启动纪念日;《俄罗斯方块》发布;小红书成立
  19. 超级简单的 RocketMQ 流量削峰实战
  20. tplinkwr710n改无线打印服务器,TP-Link TL-WR710N V1无线路由器AP模式设置

热门文章

  1. 我的docker随笔2:docker在ubuntu上的安装
  2. 线程导入大数据入库_大数据处理及分析该怎么做?用这款数据分析软件轻松搞定...
  3. python拿什么做可视化界面好_5大Python可视化库到底选哪个好?一篇文章搞定从选库到教学...
  4. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
  5. 03-NIO通讯模型
  6. 【Elasticsearch】腾讯万亿级 Elasticsearch 内存效率提升解密 源码级别 性能优化
  7. 【elasticsearch】 Regexes are disabled. Set [script.painless.regex.enabled] to [true]
  8. 【Spring】Spring Bean 定义继承
  9. Spring : Spring自定义FactoryBean
  10. 02-dos2unix命令与windows编辑shell不可执行问题