socket异步处理问题
具体结构是这样的:本项目作为服务器端,第三方软件是客户端,并且有多个客户端。
通常情况下,要开多个线程来处理多个客户端,并且一个客户端要占用一个端口,每个客户端在访问服务端时,服务器端要找到当前空闲的端口返回给客户端进行调用。
msdn上提供了这种的解决方案:
http://www.microsoft.com/china/msdn/archives/library/dncscol/html/csharp09182003.asp
但是,经过我今天的摸索,发现用socket异步处理也能解决这个问题,只要一个端口就可以给n个客户端访问了。
并且客户不需要做异步处理,只是服务端做异步处理就可以了。这样的话,第三方软件改动量就很小,主要控制权在我这里。
客户端做法的代码片断:
创建连接:
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端口号
发送数据:
Byte [ ] bySend = new byte [ iLength ] ; //根据获取的长度定义一个Byte类型数组
bySend = System.Text.Encoding.Default.GetBytes
( textBox2.Text ) ; //按照指定编码类型把字符串指定到指定的Byte数组
int i = mobj_stSend.Send ( bySend ) ; //发送数据
服务器端做了一个Socket数组来存放所有客户端的连接:
public static ManualResetEvent allDone = new ManualResetEvent(false);
private Socket [] SocClient;
private const int MAX_SOCKET= 100;
Thread mobj_thTreadRead;
启动监听线程:
mobj_thTreadRead.Start() ;//启动线程
button1.Enabled = false ;
在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);
}
}
实现回调方法:
{
try
{
allDone.Set();
WSocket listener = (WSocket) ar.AsyncState;
int nSoc = GetAvailbleSocket(); //获取有效的Socket,即一个新的Socket实例
SocClient[nSoc] = (Socket)ListenSoc.EndAccept(ar);
//在这里处理接收过来得数据
}
}
{
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异步处理问题相关推荐
- Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输)、监控客户端屏幕(UDP传输),抖动用户窗体、发送文件给用户、扫描客户的C盘目录。
用VS2015工具C#语言编写了一个简单的Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输).监控客户端屏幕(UDP传输),抖动用户窗体.发送文件 ...
- Hololens2初入—— Unity socket 异步通讯
Hololens2初入--socket 异步通讯 介绍 Hololens2真机中运行的程序与在电脑端的程序要求有些不同. 它不支持同步的socket,必须采用异步的形式才能跑的通.具体的原因和细节我也 ...
- Windows网络通信(二):socket异步编程
简述 这里使用的API和同步编程的API是差不多的,只多了一个ioctlsocket和select函数.这里面涉及一个很重要的结构体fd_set.这里用到的API大部分都是windows和linux通 ...
- java socket 异步回调函数_浅谈socket同步和异步、阻塞和非阻塞、I/O模型
原标题:浅谈socket同步和异步.阻塞和非阻塞.I/O模型 在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针 ...
- java socket 异步回调函数,分享nodejs异步编程基础之回调函数用法
nodejs异步编程基础之回调函数用法分析 本文实例讲述了nodejs异步编程基础之回调函数用法.分享给大家供大家参考,具体如下: Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实 ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...
- boost::asio向socket中异步读写数据
内容代码参考自: Boost.Asio C++ Network Programming Cookbook 异步写入数据的核心是异步回调函数. 在此之前, 必须弄明白异步IO的基本概念和回调函数触发的时 ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0
本文原创版权归 CSDN hulihui 所有,转载请按照如下方式显示标明原创作者及出处,以示尊重!! 作者: hulihui 原文:http://blog.csdn.net/hulihui/arch ...
- 日常——异步Socket实现中的问题
尝试了Socket的一般实现,同步处理,没什么问题了. 另外发现调用Socket的时候,经常Socket就调用getOutputStream()取出OutputStream输出流,然后写么,一般都习惯 ...
最新文章
- Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结
- .NET小笔记之程序集
- 【Linux】用户与权限
- 感受机房管理化繁为简-新款KVM使用心得
- oracle 汇总上面所有,Oracle经验技巧汇总
- mysql sysbench_详解MySQL基准测试和sysbench工具
- Oralce weblogic 11g 安装部署使用手册
- c语言实现数据结构中的链式表
- 进阶版启动jupyterlab教程
- 解决stackoverflow加载慢的插件
- 第二十四章 异常和错误处理 6异常类与模板的关系
- Microsoft visio 2010 Premium 的激活
- 倍福BECKHOFF PLC:自动化编程笔记
- 抛砖引玉——Stagefright漏洞初探
- matlab-高数 diff 二阶偏导数
- 软件构造笔记——Rep Invariantand Abstraction Function
- 有个空间,名叫 Gamma
- 电脑使用技巧 快捷键
- python的if-else语法
- 我的世界mod开发(6)无敌的护甲