解决方案 »
- 问大家个基础的问题.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 如何把“Fri Jul 24 16:05:00 PDT 2009”解析为DateTime
- 组合控件如何居中对齐?
- 那位有.net 加密后只有是大写字母和数字函数
- GridView 怎样找单元格的第二个控件
- DevExpress 能否打印空行
- 告诉我为什么不能编译成功
- .NET 和JAVA 朝那个方向发展好呢 !!!
- 想给C#中做的菜单加上彩色皮肤,请问高手如何办
- 哪位高人给解释解释关于regular expression 的问题
- C# 动态生成xm schema 文件
- 一个COM组件调用的问题
// 开始等待客户发送数据
private void WaitForData(System.Net.Sockets.Socket socket, int clientNumber)
{
try
{ SocketPacket socketPacket = new SocketPacket(socket, clientNumber); if (pfnWorkerCallBack == null)
{
// 当连接上的客户有写的操作的时候,调用回调函数
pfnWorkerCallBack = new AsyncCallback(OnDataReceived); socket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, socketPacket);
}
else
{
if (doit == null)
{
pfnWorkerCallBack = new AsyncCallback(OnDataReceived); socket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, socketPacket);
}
}
}
catch (SocketException)
{
//MessageBox.Show(se.Message, "提示00");
}
}这个是 接受数据
// 接收数据
private void OnDataReceived(IAsyncResult asyn)
{
try
{ //object dd= theSockId.thisSocket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer);
// EndReceive完成BeginReceive异步调用,返回服务器写入流的字节数
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.thisSocket.EndReceive(asyn);
// 用UTF8格式来将string信息转化成byte数组形式
theSockId.sb.Append(System.Text.Encoding.UTF8.GetString(theSockId.buffer, 0, iRx)); //获取消息
string szData = theSockId.sb.ToString(); //清空已读消息
theSockId.sb.Remove(0, szData.Length); // 等待数据 if (szData.Length > 0)
{
//处理获得的信息
ByteCollectToFile(szData);
} //清空缓冲区
Null = new byte[iRx]; theSockId.buffer = Null; // 等待数据
WaitForData(); } catch (ObjectDisposedException)
{ //Socket已经关闭!
string msg = "-ConnError_1"; //传回信息
onServerMsg(msg); }
catch (SocketException se)
{ if (se.ErrorCode == 10054)
{ //服务器停止服务!
string msg = "-ConnError_0"; //传回信息
onServerMsg(msg); clientSocket.Close(); clientSocket = null; }
}
}这个是我自定义的对象
public class SocketPacket
{ public System.Net.Sockets.Socket currentSocket; // 当前的Socket
public int clientNumber; // 客户号
public const int BufferSize = 4096;
public byte[] dataBuffer = new byte[BufferSize]; // 发给服务器的数据
public StringBuilder sb = new StringBuilder();
// 构造函数
public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber)
{
currentSocket = socket;
this.clientNumber = clientNumber;
} }
{ public System.Net.Sockets.Socket thisSocket; public const int BufferSize = 1024*100;// 发给服务器的数据 public byte[] buffer = new byte[BufferSize]; public StringBuilder sb = new StringBuilder();
}
如果循环去BeginReceive,虽然接收缓存是受限制了,但循环获取不会影响太多效率。