socket异步处理问题

由于一个项目要和第三方软件做接口,第三方软件是Unix的操作系统,所以用了Socket来传输数据。
具体结构是这样的:本项目作为服务器端,第三方软件是客户端,并且有多个客户端。

通常情况下,要开多个线程来处理多个客户端,并且一个客户端要占用一个端口,每个客户端在访问服务端时,服务器端要找到当前空闲的端口返回给客户端进行调用。
msdn上提供了这种的解决方案:
http://www.microsoft.com/china/msdn/archives/library/dncscol/html/csharp09182003.asp

但是,经过我今天的摸索,发现用socket异步处理也能解决这个问题,只要一个端口就可以给n个客户端访问了。
并且客户不需要做异步处理,只是服务端做异步处理就可以了。这样的话,第三方软件改动量就很小,主要控制权在我这里。
客户端做法的代码片断:
创建连接:
mobj_stSend = new Socket ( AddressFamily.InterNetwork , 
                    SocketType.Stream , ProtocolType.Tcp ) ; 
//初始化一个Socket实例 
                
                IPEndPoint tempRemoteIP 
= new IPEndPoint 
                    ( IPAddress.Parse ( textBox1.Text ) , mi_port ) ; 
//根据IP地址和端口号创建远程终结点 
                
                EndPoint epTemp 
= ( EndPoint ) tempRemoteIP ; 
                mobj_stSend.Connect ( epTemp ) ; 
//连接远程主机的8000端口号 

发送数据:
 int iLength = textBox2.Text.Length ; //获取要发送的数据的长度 
            
                Byte [ ] bySend 
= new byte [ iLength ] ; //根据获取的长度定义一个Byte类型数组 
            
                bySend 
= System.Text.Encoding.Default.GetBytes 
                    ( textBox2.Text ) ; 
//按照指定编码类型把字符串指定到指定的Byte数组 
            
                
int i = mobj_stSend.Send ( bySend ) ; //发送数据 

服务器端做了一个Socket数组来存放所有客户端的连接:
private Socket ListenSoc ; 
        
public static ManualResetEvent allDone = new ManualResetEvent(false);
        
private Socket [] SocClient;
        
private const int MAX_SOCKET= 100;
        Thread mobj_thTreadRead;

启动监听线程:
 
mobj_thTreadRead = new Thread ( new ThreadStart ( Listen ) ) ;//以Listen过程来初始化Thread实例            
            mobj_thTreadRead.Start() ;//启动线程            
            button1.Enabled = false  ;

在Listen方法中使用异步访问:
void Listen()
        
{
            
int nPort = 8000;            
            IPEndPoint ipLocalEndPoint;
            
try
            
{
//                IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
                ipLocalEndPoint = new IPEndPoint(GetServerIP(), nPort); 
            }

            
catch(SocketException socErr )
            
{
                MessageBox.Show(socErr.Message);
                
return;
            }

           
            
try
            
{                
                ListenSoc 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp );
                ListenSoc.Bind(ipLocalEndPoint);
                ListenSoc.Listen(
100);
                
while (true)
                
{
                    allDone.Reset();
                    ListenSoc.Soc.BeginAccept(
new AsyncCallback(AcceptCallback),ListenSoc); //异步访问,并定义回调方法
                    allDone.WaitOne();

                }

            }

            
catch(Exception err) 
            
{
                MessageBox.Show(err.Message);
            }

        }

实现回调方法:
public void AcceptCallback(IAsyncResult ar) 
        
{
            
try
            
{
                allDone.Set();
                WSocket listener 
= (WSocket) ar.AsyncState;
                
int nSoc = GetAvailbleSocket(); //获取有效的Socket,即一个新的Socket实例
SocClient[nSoc] = (Socket)ListenSoc.EndAccept(ar);
//在这里处理接收过来得数据
}

}

private int GetAvailbleSocket()
        
{
            
int i=-1;
            
for( i=0;i<MAX_SOCKET;i++)
            
{
                
try
                
{
                    
if (SocClient[i]==null)
                        
break;
                    
else
                    
{
                        
if (!SocClient[i].Soc.Connected)
                            
break;
                    }

                }

                
catch (Exception err) 
                
{
                    MessageBox.Show(
"GetSock :"+err.Message);
                }


            }


            
if ((i>-1)&& (i <MAX_SOCKET))  
                InitSocket(
ref SocClient[i],i);
            
return i;
        }
 

转载于:https://www.cnblogs.com/duadu/archive/2007/09/21/6167035.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022爆火的AIGC,能给AI续命吗

文 | 陈彩娴源 | AI科技评论生产力如已成熟&#xff0c;想象力还会远吗&#xff1f;“你们是从什么时候开始注意到人类的&#xff1f;”“当第一个原始人开始仰望星空的时候。”AI 的类人猿&#xff0c;早已开始仰望人类。来自机器的审视在过去短短的两年间&#xff0c;算法从业…

LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

1. 题目 给定一些标记了宽度和高度的信封&#xff0c;宽度和高度以整数对形式 (w, h) 出现。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”…

python语言语句块标记是_Python的基本语法——语句块

1.语句块是在条件为真&#xff08;条件语句&#xff09;时执行或者执行多次&#xff08;循环语句&#xff09;的一组语句&#xff1b; 2在代码前放置空格来缩进语句即可创建语句块&#xff0c;语句块中的每行必须是同样的缩进量&#xff1b; 3.缩进&#xff1a;Python开发者有意…

[导入]设计模式初学者系列-工厂方法

摘要: 闲谈工厂方法 设计模式系列到了第四篇了&#xff0c;如果还不谈谈工厂方法设计模式就太对不起GoF了&#xff0c;为什么有如此一说&#xff1f;实际上工厂方法模式是好些模式的基石&#xff0c;她们或多或少的使用了工厂方法模式或以工厂方法为模型。 工厂方法模式是一种类…

推荐一个好发论文的研究方向

今天给大家推荐一个研究的好方向—— 图神经网络。它是近些年学术界和工业界最新的研究热点&#xff01;在社交网络、知识图谱、推荐系统等工业界有广阔的应用前景。最重要的是&#xff0c;图神经网络与CV和NLP交叉&#xff0c;容易有创新点&#xff0c;是出论文的好方向。对于…

LeetCode 31. 下一个排列(线性扫描)

1. 题目 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

Google工作10年的职场感悟

源&#xff5c;电子发烧友网、程序厨哈喽大家好&#xff0c;今天坐地铁读到了一位在 Google 工作10年的“老”工程师关于技术、管理和职场生涯的感悟。我看完后觉得很有收获&#xff0c;因此在这里也分享给大家。以下是全文&#xff0c;后文中的「我」均指「原作者」。我在 Goo…

博客堂joycode被黑掉了

博客堂现在用ie7已经打不开了&#xff0c;用telnet www.joycode.com 80 链接&#xff0c;链接成功之后输入大写的命令 GET / 然后连续两次回车&#xff0c;就可以看到第一行的木马代码<iframe src?????? width20 height0 frameborder0></iframe>。访问其中任…

python的注释符_Python3 注释和运算符

Python3 注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释&#xff1a; Python中单行注释以 # 开头&#xff0c;例如&#xff1a;&#xff1a; #这是一个注释 print("Hello, World!") 多行注释用三个单引号 或者三个双引号…

程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)

文章目录1. 题目2. 解题2.1 STL2.2 线性扫描2.3 位运算1. 题目 下一个数。给定一个正整数&#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数&#xff08;一个略大&#xff0c;一个略小&#xff09;。 例1:输入&#xff1a;num 2&#xff08;或者0b10&am…

同花顺如何切换k线_K线之形态学:浅谈纸白银产品该如何去做好交易?

K线之形态学&#xff1a;浅谈纸白银产品该如何去做好交易&#xff1f;由于疫情期间&#xff0c;明显感觉到今年做投资理财的朋友多了&#xff0c;特别是银行的纸产品&#xff0c;我是分析外盘伦敦银伦敦金为主&#xff0c;自己也是只操作外盘产品。国内的不管是纸白银或者TD白银…

从NeurIPS论文来看,中美学者很少互相引用

源&#xff5c;机器之心想要改变这种情况还很难。不知从何时起&#xff0c;我们习惯了人工智能的学术顶会上中美研究数量排名前两位的形势。不论在工业还是学术上&#xff0c;两者很大程度上引领了技术的发展&#xff0c;中美的交流也非常密切&#xff1a;不少大厂都会在对面设…

[导入][导入][c#]Web开发中Tag的开发技巧

http://onewww.net/blog/article.asp?id87网站开发常用关键字(tag)&#xff0c;一般需要获得最多的被采用的Tag&#xff0c;也就是流行词。通常思路是将关键字tag保存到单独表中&#xff0c;然后在其他表中根据一组id进行对多个关键字进行标识。因为一个文章可以选择多个tag&a…

泰坦尼克号生存预测入门

文章目录1. 数据预览2. 特征初步选择3. 增加特征Sex和Embarked4. 选择随机森林调参5. 实践总结本文作为学习记录&#xff0c;参考 此处&#xff0c;如有侵权&#xff0c;联系删除。1. 数据预览 数据集下载 import pandas as pd import numpy as np from pandas import Series…

excel去重_数据处理之EXCEL的高效技巧分享

这是一个技巧贴&#xff0c;直接上干货&#xff1a;1、你想在excel中看到函数值是如何计算出来的&#xff1f;Ctrl~&#xff1a;进入函数视图2、去除重复值方式有哪些?a、数据—数据工具—删除重复值(以当前选定区域排序&#xff1a;只对选中区域去重&#xff1b;扩展选定区域…

泄露了 5.33 亿 Facebook 用户的个人资料后,Meta 被罚款 2.75 亿美元

文 | 兔子酱编 | 王思若大家好&#xff0c;我是兔子酱。多年前&#xff0c;Facebook曾被曝出一个大瓜——2018 年 5 月至 2019 年 9 月期间&#xff0c;不法分子利用 Facebook 的安全漏洞从 5.33 亿人的个人资料中窃取个人信息&#xff0c;包括电话号码、位置、电子邮件地址、生…

10月24日 多云

10月24号 多云 最近不知怎么了 突然很没有食欲 不到半夜不知道饿。 中午下楼吃饭&#xff0c;走了半天也不知道想吃什么&#xff0c;索性走进了一个菜市场&#xff0c;买了一个鸡架&#xff0c;打道回府。哦对了&#xff0c;路上还买了几个苹果&#xff0c;牙总出血&#xff0c…

程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**

1. 题目 从左向右遍历一个数组&#xff0c;通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉树&#xff0c;输出所有可能生成此树的数组。 示例: 给定如下二叉树2/ \1 3 返回:[[2,1,3],[2,3,1] ]来源&#xff1a;力扣&#xff08…

在央企做程序员是种什么体验?

源 | 程序厨今天在秀哥那里看到了这篇文章&#xff0c;个人感觉对一些想要进入央企的同学&#xff0c;有一些帮助&#xff0c;大家可以看一下&#xff0c;以下为正文。朋友校招加入了某垄断央企&#xff0c;在里面从事研发工程师的工作&#xff0c;下面将分享一些入职后的一些心…

pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

编 程 的 朝 圣 之 路----------------------------------------当程序中包含多个线程时&#xff0c;CPU 不是一直被特定的线程霸占&#xff0c;而是轮流执行各个线程。那么&#xff0c;CPU 在轮换执行线程的过程中&#xff0c;即从创建到消亡的整个过程&#xff0c;可能会历经…