c 中服务器多次接受消息,c/s模拟高并发服务器端线程池接收问题
//4.开启一个新线程不断接受用户的连接请求
ThreadPool.QueueUserWorkItem(new WaitCallback(skObj =>
{
Socket skConnP = skObj as Socket;
//通过循环不断接受用户的连接请求
while (true)
{
//阻塞线程,等待用户的连接请求
Socket skCommu = skConnP.Accept();
//获取客户端信息
string userinfo = skCommu.RemoteEndPoint.ToString();
txtLog.Invoke(new Action(u =>
{
txtLog.AppendText("客户端【" + u + "】连接成功!" + Environment.NewLine);
}), userinfo);
listboxUserList.Invoke(new Action(u =>
{
listboxUserList.Items.Add(u);
}), userinfo);
if (!_dict.ContainsKey(userinfo))
{
_dict.Add(userinfo, skCommu);
}
//新建一个文本来记录数据
// StreamWriter sw = new StreamWriter("temp.txt",true);
//再启动一个线程来循环接收用户发来的消息
ThreadPool.QueueUserWorkItem(new WaitCallback(skCommuObj =>
{
Socket skCommuP = skCommuObj as Socket;
while (true)
{
byte[] buffers = new byte[1024 * 1024 * 2];
int len = skCommuP.Receive(buffers);
if (len == 0)
{
//当客户端退出以后,在log文本框中显示用户退出的信息
txtLog.Invoke(new Action(x =>
{
txtLog.AppendText("客户端【" + x + "】退出了。");
}), skCommuP.RemoteEndPoint.ToString());
//写入文件
//sw.WriteLine("客户端【" + skCommuP.RemoteEndPoint.ToString() + "】退出了。");
// sw.Close();
//从ListBox中删除当前用户
listboxUserList.Invoke(new Action(x =>
{
listboxUserList.Items.Remove(x);
}), skCommuP.RemoteEndPoint.ToString());
//删除Dictionary中的内容
_dict.Remove(skCommuP.RemoteEndPoint.ToString());
break;
}
else
{
string userMessage = Encoding.UTF8.GetString(buffers, 0, len);
//把用户发来的消息显示到txtLog上。
txtLog.Invoke(new Action((msg, uinfo) =>
{
txtLog.AppendText("客户端【" + uinfo + "】在"+DateTime.Now.ToString()+"发来消息:" + msg + Environment.NewLine);
}), userMessage, skCommuP.RemoteEndPoint.ToString());
//写入文件
//sw.WriteLine("客户端【" + skCommuP.RemoteEndPoint.ToString() + "】在" + DateTime.Now.ToString() + "发来消息:" + userMessage);
}
}
}), skCommu);
}
}), _skConn);
c 中服务器多次接受消息,c/s模拟高并发服务器端线程池接收问题相关推荐
- flask模拟集群实现消息队列和简单高并发支持
思路: 1.一个总端口实现服务的代理和分发--使用gevent做协程,解决高并发: 2.多个子端口实现集群构建业务层--使用make_server,构成消息队列: 3.总端口/子端口--增加延迟启动/ ...
- 高并发系统设计十六(消息队列削峰)
在前面章节,我们了解了高并发系统设计的三个目标:性能.可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能.也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧.究其原 ...
- Linux高并发服务器开发---笔记4(网络编程)
0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...
- Java线程池实现原理及其在美团业务中的实践
来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...
- java中线程池的几种实现方式
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 ...
- 游戏服务器内三类线程池的划分与使用
在游戏服务器开发中,对于服务器的性能要求特别高,主要的指标就是整个系统的吞吐量,就是平时所说的QPS.目前使用的服务器都是多核的,想要提升系统的QPS,就需要使用到多线程,但是线程资源对于服务器来说非 ...
- 【有料】Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
最新文章
- quick-cocos2dx-2.2.4环境搭建
- 虚拟化文件服务器,VMware虚拟化效率之文件服务器性能测试(上)
- 正在写一个VC的聊天软件
- R语言实战应用精讲50篇(五)-多重线性回归系列之模型拟合
- python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
- [CQOI2018] 交错序列(矩阵加速优化dp)
- 一不小心就掉大啦《数组使用注意》
- 解决 favicon.ico 404 (Not Found)
- 面试 | #面试面试面试 做#Java 就是要这种不要脸的…
- AJPFX分析int 和integer的区别
- Spring Boot入门——多文件上传大小超限问题解决
- [Swift]LeetCode528. 按权重随机选择 | Random Pick with Weight
- python 将txt文件转换为excel_Python实现读取txt文件并转换为excel的方法示例
- 透视投影中3DMM系数的求解
- 视频怎么加水印?这里有你想要的答案
- LoadRunner函数大全
- 计算机硬盘容量单位换算,为什么新硬盘容量不对是什么原因?原来是硬盘容量单位换算的问题...
- PHP 获取手机号运营商
- 详解5种网站 静态网站、动态网站、伪静态网站、云计算网站都是什么
- 不容错过, Paintinglite轻量级Sqlite3框架
热门文章
- 将指定的计数添加到该信号量中会导致其超过最大计数
- Windows起一个Docker镜像——起起起起起~不~来~
- Pytorch音频分类
- dubbo分布式服务框架(高级特性篇)
- shell运行python脚本报错没有包_脚本安装Discuz论坛(shell + Python 实现自动化安装)...
- 鲁能群英荟萃 萝卜开会
- python 老师_一个法语老师的python 入门之路
- postman脚本批量请求
- wps多人协作后怎么保存_在线协同文档分享后,别人只能看却不能写怎么办?
- 查看/修改git用户名密码