惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
月光博客
月光博客
Recent Announcements
Recent Announcements
S
Secure Thoughts
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Troy Hunt's Blog
量子位
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
云风的 BLOG
云风的 BLOG
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
WordPress大学
WordPress大学
T
Threat Research - Cisco Blogs
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
P
Privacy & Cybersecurity Law Blog
aimingoo的专栏
aimingoo的专栏
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Darknet – Hacking Tools, Hacker News & Cyber Security
U
Unit 42
Schneier on Security
Schneier on Security
大猫的无限游戏
大猫的无限游戏
I
Intezer
Hacker News: Ask HN
Hacker News: Ask HN
H
Heimdal Security Blog
Cisco Talos Blog
Cisco Talos Blog
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Help Net Security
Latest news
Latest news
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LangChain Blog
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
小众软件
小众软件
M
MIT News - Artificial intelligence
A
About on SuperTechFans
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
NISL@THU
NISL@THU
博客园_首页
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
Lohrmann on Cybersecurity
T
Tenable Blog

博客园 - o0myself0o

利用线程池实现多客户端和单服务器端Socket通讯(二):异步编程模型实现 生产者消费者模式,代码中碰到的疑问(已解决) Entity Framework 4.0 ObjectContext下的各种方法实践 题目:若干个不重复数,打乱顺序输出 wtf js(四) - o0myself0o - 博客园 wtf js(三) number的类型不是number wtf js(二) 算法:给定两个已从小到大排好序的整型数组arrA和arrB,将两个数组合并成arrC,使得arrC也要按从小到大的顺序排好序 应用中的单例模式 面试题:给你三个bool类型变量a, b, c,判断至少有两个为true javascript面向对象编程(一) - o0myself0o - 博客园 wtf js(一) - o0myself0o - 博客园 社区网站功能实现系列(三):社区页面无刷新回发的一种实现方式 社区网站功能实现系列(二):社区内容分享到别的SNS 社区网站功能实现系列(一):多国语言的实现 反射获取Class中Property的值 A*寻路初探 闲谈ASP.NET 2.0缓存技术 使用 jQuery 简化 Ajax 开发
利用线程池实现多客户端和单服务器端Socket通讯(一):同步方式
o0myself0o · 2011-03-31 · via 博客园 - o0myself0o

线程池:
线程池使用方式:ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)
WaitCallback的方法签名:public delegate void WaitCallback(object state) ; //传入一个object上下文Socket:
常用实例方法:Connect(), Bind(EndPoint localEP), Listen(int backlog), Accept(), Receive(byte[] buffer), Close()

示例:
// Server端

namespace SocketMultiThreadServer
{
    
public partial class Form1 : Form
    {
        Socket socket;
        
public Form1()
        {
            InitializeComponent();
            InitSocket();
        }
private void InitSocket()
        {
            socket 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPHostEntry ipHostEntry 
= Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint ipEndPoint 
= new IPEndPoint(ipHostEntry.AddressList[0], 8091); // 这个AddressList属性返回的是一个IP列表,包括若干个IPv6、IPv4的值,我们要获取的IPv4值的下标会随着环境的变化改变,不知道有没有解决方法
            socket.Bind(ipEndPoint);
            socket.Listen(
20); // 设置允许的挂起连接队列的长度最大值为20
        }private void btnBeginRec_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem((_) 
=>
            {
                
while (true)
                {
                    Socket socketAccept 
= null;
                    
if (socket.Poll(-1, SelectMode.SelectRead)) // 确定socket的状态
                    {
                        socketAccept 
= socket.Accept(); // 接收客户端发来的Socket连接,每个连接的客户端都会保持一个Socket实例
                    }
                    
if (socketAccept != null)
                    {
                        ThreadPool.QueueUserWorkItem((o) 
=>
                        {
                            
while (true)
                            {
                                
byte[] byteArray = new byte[100];
                                socketAccept.Receive(byteArray); 
// 接收客户端发来的消息
                                string strRec = System.Text.Encoding.UTF8.GetString(byteArray);
                                
if (this.txtMsg.InvokeRequired) // 判断当前线程(调用方)是否是主线程之外的线程,txtMsg是一个TextBox
                                {
                                    
this.txtMsg.Invoke(new ChangeText(ShowMsg), strRec); // 返回给主线程去做UI呈现
                                }
                                System.Threading.Thread.Sleep(
100);
                            }
                        });
                    }
                }
            });
            System.Threading.Thread.Sleep(
100);
        }
delegate void ChangeText(string obj);
        
private void ShowMsg(string obj)
        {
            
this.txtMsg.AppendText(obj + "  ");
        }
    }
}

// Client端

namespace SocketMultiThreadClient
{
    
class Program
    {
        
static void Main(string[] args)
        {
            Socket socket 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPHostEntry ipHostEntry 
= Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint ipEndPoint 
= new IPEndPoint(ipHostEntry.AddressList[0], 8091); //指定要连接的服务端的IP和端口
            socket.Connect(ipEndPoint);while (true)
            {
                
string input = Console.ReadLine();
                
try
                {
                    socket.Send(System.Text.Encoding.UTF8.GetBytes(input)); 
// 向服务端(指定的IP和端口)发送流消息
                }
                
catch (Exception ex)
                {
                    
if (socket != null)
                    {
                        socket.Close();
                        Console.WriteLine(
"Client Error: " + ex.Message);
                    }
                }
                System.Threading.Thread.Sleep(
100);
            }
        }
    }
}


Hope this helps. :)

利用线程池实现多客户端和单服务器端Socket通讯(二):异步编程模型实现