由于一个项目要和第三方软件做接口,第三方软件是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

socket异步处理问题相关推荐

  1. Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输)、监控客户端屏幕(UDP传输),抖动用户窗体、发送文件给用户、扫描客户的C盘目录。

    用VS2015工具C#语言编写了一个简单的Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输).监控客户端屏幕(UDP传输),抖动用户窗体.发送文件 ...

  2. Hololens2初入—— Unity socket 异步通讯

    Hololens2初入--socket 异步通讯 介绍 Hololens2真机中运行的程序与在电脑端的程序要求有些不同. 它不支持同步的socket,必须采用异步的形式才能跑的通.具体的原因和细节我也 ...

  3. Windows网络通信(二):socket异步编程

    简述 这里使用的API和同步编程的API是差不多的,只多了一个ioctlsocket和select函数.这里面涉及一个很重要的结构体fd_set.这里用到的API大部分都是windows和linux通 ...

  4. java socket 异步回调函数_浅谈socket同步和异步、阻塞和非阻塞、I/O模型

    原标题:浅谈socket同步和异步.阻塞和非阻塞.I/O模型 在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针 ...

  5. java socket 异步回调函数,分享nodejs异步编程基础之回调函数用法

    nodejs异步编程基础之回调函数用法分析 本文实例讲述了nodejs异步编程基础之回调函数用法.分享给大家供大家参考,具体如下: Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实 ...

  6. 基于MFC的socket编程(异步非阻塞通信)

    对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...

  7. boost::asio向socket中异步读写数据

    内容代码参考自: Boost.Asio C++ Network Programming Cookbook 异步写入数据的核心是异步回调函数. 在此之前, 必须弄明白异步IO的基本概念和回调函数触发的时 ...

  8. 可扩展多线程异步Socket服务器框架EMTASS 2.0

    本文原创版权归 CSDN hulihui 所有,转载请按照如下方式显示标明原创作者及出处,以示尊重!! 作者: hulihui 原文:http://blog.csdn.net/hulihui/arch ...

  9. 日常——异步Socket实现中的问题

    尝试了Socket的一般实现,同步处理,没什么问题了. 另外发现调用Socket的时候,经常Socket就调用getOutputStream()取出OutputStream输出流,然后写么,一般都习惯 ...

最新文章

  1. Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结
  2. .NET小笔记之程序集
  3. 【Linux】用户与权限
  4. 感受机房管理化繁为简-新款KVM使用心得
  5. oracle 汇总上面所有,Oracle经验技巧汇总
  6. mysql sysbench_详解MySQL基准测试和sysbench工具
  7. Oralce weblogic 11g 安装部署使用手册
  8. c语言实现数据结构中的链式表
  9. 进阶版启动jupyterlab教程
  10. 解决stackoverflow加载慢的插件
  11. 第二十四章 异常和错误处理 6异常类与模板的关系
  12. Microsoft visio 2010 Premium 的激活
  13. 倍福BECKHOFF PLC:自动化编程笔记
  14. 抛砖引玉——Stagefright漏洞初探
  15. matlab-高数 diff 二阶偏导数
  16. 软件构造笔记——Rep Invariantand Abstraction Function
  17. 有个空间,名叫 Gamma
  18. 电脑使用技巧 快捷键
  19. python的if-else语法
  20. 我的世界mod开发(6)无敌的护甲

热门文章

  1. openssl、ssh
  2. SQL Server CLR全功略之一---CLR介绍和配置
  3. SQL Server文本和图像函数
  4. 简单的机器学习程序_人体动作识别小程序【机器学习 人工智能】
  5. python 内置模块 subprocess
  6. Flask 离线脚本
  7. 【urllib】url编码问题简述
  8. anaconda来创建python环境
  9. 机器学习中各类算法的优缺点比较
  10. selector多路复用_多路复用器Selector