用socket底层原理实现简单聊天室程序,本篇为服务器端2.0版本(完结篇)

https://gitee.com/muyiafa/socketchatroom

socketChatRoom_Client(聊天室客户端)_木易阿发的博客-CSDN博客

文章目录

* 1、启动服务器:构造方法 new ServerSocek对象并绑定程序端口
* 2、等待连接:
* 3、获取客户端发送的信息及客户端主机信息并打印在控制台
* 4、多线程支持被多个客户端连接互不干扰
* 5、广播给所有客户端其他客户端发送过来的消息
* 6、将PrintWriter数组换成集合列表优化减少代码和拓展的便捷
* 7、端口8888


package homeWork.ChatRoom220707;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/*** author:木易阿发* time:220707* moditime:220710* port:8888* 1、启动服务器:构造方法 new ServerSocek对象并绑定程序端口* 2、等待连接:* 3、获取客户端发送的信息及客户端主机信息并打印在控制台* 4、多线程支持被多个客户端连接互不干扰* 5、广播给所有客户端其他客户端发送过来的消息* 6、将PrintWriter数组换成集合列表优化减少代码和拓展的便捷性*/
public class Servers {int serverNum ;private ServerSocket  serverSocket;
//    private PrintWriter[] pws={};//在根类创建一个输出流数组用来存放所有客户端发送过来的消息private Collection<PrintWriter> pws = new ArrayList<>();//在根类创建一个输出流数组用来存放所有客户端发送过来的消息public static void main(String[] args) {Servers server = new Servers();//new对象同时初始化//调用等待连接方法server.startServer();}// 1、构造器初始化启动服务器指定端口public Servers(){try {System.out.println("duang 瓮....");serverSocket = new ServerSocket(8888);System.out.println("服务器已成功运行.哔..哔...哔....");} catch (IOException e) {e.printStackTrace();}}// 2、等待客户端连接public void startServer(){//4、多线程支持被多个客户端连接互不干扰try {while (true) {//循环不断接受用户连接从而启动新线程// 该线程任务是负责与指定的客户端进行交互Socket socket = serverSocket.accept();
//                System.out.println("ID-" + (++serverNum) + "-" + socket.getInetAddress().getHostName() + "(成功接入)");//没得到一个连接就启动一个线程单独交互Runnable clientHandler = new ClientHandler(socket, ++serverNum);//线程任务类Thread thread = new Thread(clientHandler);//线程对象thread.start();//启动线程}}catch(IOException e){e.printStackTrace();}}//3、获取客户端发送的信息及客户端主机信息并打印在控制台//客户端处理程序:处理服务器发回来的消息等private class ClientHandler implements Runnable{private int serverNum;//用户编号private Socket socket;private String host;//记录访问对象的主机地址信息public ClientHandler(Socket socket,int serverNum) {this.serverNum=serverNum;this.socket=socket;host=socket.getInetAddress().getHostName();}@Overridepublic void run() {//交互任务PrintWriter pw = null;//输出流try {InputStream is = socket.getInputStream();;//通过socket获取输入流,得到客户端发送过来的消息InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);//字符转换流,将is的字节流转换为字符BufferedReader br = new BufferedReader(isr);//缓冲字节输入流,块读取//通过start方法循环传输过来的socket获取输出流给每个客户端广播消息OutputStream os = socket.getOutputStream();//通过socket获取字节输出流OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);//字节转换流,将字符转换成字节写出指定编码BufferedWriter bw = new BufferedWriter(osw);//缓冲输出流,保证语句的完整性pw = new PrintWriter(bw,true);//字符输出流(特别注意开启行刷新),按行写出控制台输入的消息//将输出流存入输出流数组synchronized (Servers.this) {//线程同步锁,避免数组出现线程安全
//                    pws = Arrays.copyOf(pws, pws.length + 1);//先对数组扩容
//                    pws[pws.length - 1] = pw;//把输出流对象存入数组的最后一个空间位置pws.add(pw);}sendMessage("ID"+(serverNum)+"-IP"+host+" 接入上线,当前在线人数:"+pws.size());//上线广播//向所有客户端广播消息String message;while ((message = br.readLine()) != null) {sendMessage("ID"+(serverNum)+"-IP"+host+"-"+message);//向每个客户端发送当前客户端发送的消息}} catch (IOException e) {//当客户端强行关闭,服务端这里readLine会抛出异常,这里就可以catch异常从而执行finally}finally {synchronized (Servers.this) {//线程锁//如果当前pw被关闭就将当前pw从广播数组中删除并通知下线
//                    for (int i = 0; i < pws.length; i++) {
//                        if (pws[i] == pw) {//找到数组中的当前pw
//                            pws[i] = pws[pws.length - 1];//将数组中的最后一个元素赋值到被关闭的pw所在数组的位置
//                            pws = Arrays.copyOf(pws, pws.length - 1);//将数组缩容
//                            //通知下线
//                            sendMessage("ID"+serverNum+"-IP"+host+"-关闭下线了,当前在线人数:"+pws.length);
//                            break;
//                        }
//                    }pws.remove(pw);sendMessage("ID"+serverNum+"-IP"+host+"-关闭下线了,当前在线人数:"+pws.size());}}}//5、广播给所有客户端其他客户端发送过来的消息//将当前客户端发的消息发送给所有客户端private void sendMessage(String line){System.out.println(line);synchronized (Servers.this) {//线程锁
//                for (int i = 0; i < pws.length; i++) {
//                    pws[i].println(line);//调用每个客户端socket对象进行消息发送
//                }for (PrintWriter pw:pws) {pw.println(line);}}}}
}

/**------------------反爬声明o(▽)咻咻咻-------------------

** 作者:木易阿发 版权声明:**

本文为博主倾情原创文章,转载请附上源文链接!

如觉得本文对你有所收获,你的请评论点赞与

转发也将是鼓励支持我继续创作的动力。

更多精彩在视频号和公众号或 百度 *木易阿发* !

Gitee:木易阿发 (muyiafa) - Gitee.com ,

个人网站:http://www.muyiafa.com ,

乐学至善 开源共享 知行合一。

-------------------咻咻咻o(▽)反爬声明--------------------*/

socketChatRoom_Server(聊天室服务端)相关推荐

  1. 安卓多人聊天室服务端

    安卓多人聊天室服务端 服务端没有图形界面,直接上代码 package cn.ttw.netProgram.tcp;import java.io.*; import java.net.InetAddre ...

  2. 聊天室服务端和客户端的实现

    在Linux环境下,实现客户端和服务端之间的信息发送和接收,实现聊天室,可进行文件传送功能. 客户端: #include <sys/types.h> #include <sys/so ...

  3. python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)

    网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的) 最要就是握手协议和发送接受字符的方式变了 # incoding=utf ...

  4. chatroom聊天室—服务端(基于golang)

    博客地址 golang,tcp服务--客户端 源码下载 功能支持 |1.修改用户名----dorenamerenamerename"修改的用户名" | 例如:修改用户名为java, ...

  5. 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA ...

  6. c# WINFORM SOCKET编程-简单聊天程序(服务端)

    初学C#的SOCKET编程,照着网上的代码写下来,程序总是有问题,经过自己长时间的调试,完成程序,以下是原码,有需要可以参考一下,还不完善,欢迎大家批评指正.(这里的代码没更新,附件重新上传更新,在另 ...

  7. 云豹直播2022带货语音聊天室三端app源码

    2021版云豹直播app源码免费分享-附开发文档 更新 语音聊天室 整体UI更新 动态话题分类 app内置商城

  8. HTML5-WebSocket实现聊天室

    在传统的网页实现聊天室的方法是通过每隔一段时间请求服务器获取相关聊天信息来实现,然而html5带来的websocket功能改变这了这种方式.由于websocket在连接服务器后允许保持连接来进行数据交 ...

  9. 微信小程序websocket聊天室

    背景 最近做了一个微信小程序的即时通讯功能,之前我也做过node.js的websocket服务,不过是在web端应用的socket.io服务.小程序本身对http.websocket等连接均有诸多限制 ...

  10. 用Mina xscocket 通讯框架做(Flex)服务端

    前天分别用Mina xscocket 通讯框架做了个聊天室服务端(可以参考用C#,java,Delphi做的服务端) 参考API文档,开发起来非常简单,但是出现几个问题没有解决 1.flash在直接运 ...

最新文章

  1. 张小龙的小程序革命,复盘731天,用“小”来改变这个世界
  2. 【转】(原創) 如何使用ModelSim-Altera對Nios II仿真? (SOC) (Nios II) (SOPC Builder) (ModelSim) (DE2)...
  3. dfs时间复杂度_一文吃透时间复杂度和空间复杂度
  4. matlab批量修改txt内容_MATLAB作图实例:18:为饼图添加文本标签和百分比
  5. Codeforces Round #277(Div 2) A、B、C、D、E题解
  6. 前端学习(512):两列布局的第一种方式的优缺点
  7. 重磅!GitLab 在中国成立公司极狐,GitHub 还会远吗?
  8. ASP.NET MVC中的统一化自定义异常处理
  9. ensure函数_webpack的require.ensure()
  10. 用ThreadLocal代替单例模式synchronized的使用
  11. golang 语言中关于err的函数的封装使用
  12. (原)logstash-forwarder + logstash + elasticsearch + kibana
  13. Matlab GUI界面设计
  14. Hadoop2.x Yarn作业提交(客户端)
  15. python requests simplejson.errors.JSONDecodeError: Expecting value报错
  16. 重装战姬服务器维护,《重装战姬》10月29日更新维护公告
  17. JavaFX教程资源
  18. matlab roundn函数_matlab中round函数具体用法
  19. ThreadPoolExecutor线程池及参数介绍
  20. 基于scrapy-redis的分布式腾讯新闻爬虫

热门文章

  1. Android Bitmap(点阵图像、绘制图像)
  2. Para-Virtualization, Full-Virtualization和Hardware-Assisted-Virtualization
  3. Java/234. Palindrome Linked List 回文链表
  4. lv编码vi0055_LV包日期编码解读,从中古到现代都全了。
  5. 最喜欢的课程的英语作文计算机,我最喜欢的课程英语作文(2)
  6. uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)
  7. Hibernate(1)——数据访问层的架构模式
  8. 记录pure admin 使用
  9. Ubuntu20.04 LTS安装Nextcloud
  10. html捉虫游戏,[讨论]大家一起来捉虫!!