//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模拟高并发服务器端线程池接收问题相关推荐

  1. flask模拟集群实现消息队列和简单高并发支持

    思路: 1.一个总端口实现服务的代理和分发--使用gevent做协程,解决高并发: 2.多个子端口实现集群构建业务层--使用make_server,构成消息队列: 3.总端口/子端口--增加延迟启动/ ...

  2. 高并发系统设计十六(消息队列削峰)

    在前面章节,我们了解了高并发系统设计的三个目标:性能.可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能.也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧.究其原 ...

  3. Linux高并发服务器开发---笔记4(网络编程)

    0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...

  4. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  5. java中线程池的几种实现方式

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  6. 游戏服务器内三类线程池的划分与使用

    在游戏服务器开发中,对于服务器的性能要求特别高,主要的指标就是整个系统的吞吐量,就是平时所说的QPS.目前使用的服务器都是多核的,想要提升系统的QPS,就需要使用到多线程,但是线程资源对于服务器来说非 ...

  7. 【有料】Java线程池实现原理及其在美团业务中的实践

    随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...

  8. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍

    1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...

  9. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

最新文章

  1. quick-cocos2dx-2.2.4环境搭建
  2. 虚拟化文件服务器,VMware虚拟化效率之文件服务器性能测试(上)
  3. 正在写一个VC的聊天软件
  4. R语言实战应用精讲50篇(五)-多重线性回归系列之模型拟合
  5. python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
  6. [CQOI2018] 交错序列(矩阵加速优化dp)
  7. 一不小心就掉大啦《数组使用注意》
  8. 解决 favicon.ico 404 (Not Found)
  9. 面试 | #面试面试面试 做#Java 就是要这种不要脸的…
  10. AJPFX分析int 和integer的区别
  11. Spring Boot入门——多文件上传大小超限问题解决
  12. [Swift]LeetCode528. 按权重随机选择 | Random Pick with Weight
  13. python 将txt文件转换为excel_Python实现读取txt文件并转换为excel的方法示例
  14. 透视投影中3DMM系数的求解
  15. 视频怎么加水印?这里有你想要的答案
  16. LoadRunner函数大全
  17. 计算机硬盘容量单位换算,为什么新硬盘容量不对是什么原因?原来是硬盘容量单位换算的问题...
  18. PHP 获取手机号运营商
  19. 详解5种网站 静态网站、动态网站、伪静态网站、云计算网站都是什么
  20. 不容错过, Paintinglite轻量级Sqlite3框架

热门文章

  1. 将指定的计数添加到该信号量中会导致其超过最大计数
  2. Windows起一个Docker镜像——起起起起起~不~来~
  3. Pytorch音频分类
  4. dubbo分布式服务框架(高级特性篇)
  5. shell运行python脚本报错没有包_脚本安装Discuz论坛(shell + Python 实现自动化安装)...
  6. 鲁能群英荟萃 萝卜开会
  7. python 老师_一个法语老师的python 入门之路
  8. postman脚本批量请求
  9. wps多人协作后怎么保存_在线协同文档分享后,别人只能看却不能写怎么办?
  10. 查看/修改git用户名密码