c#Socket异步通信源码Word文档下载推荐.docx
《c#Socket异步通信源码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《c#Socket异步通信源码Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
//注册事件
AcceptedSocket.OnStringDataAccept+=newStringDataAcceptHandler(AcceptedSocket_OnStringDataAccept);
AcceptedSocket.OnClosed+=newAsySocketClosedEventHandler(AcceptedSocket_OnClosed);
AcceptedSocket.BeginAcceptData();
//加入
clients.Add(AcceptedSocket.ID,AcceptedSocket);
voidAcceptedSocket_OnClosed(stringSocketID,stringErrorMessage)
//客户端关闭
clients.Remove(SocketID);
}
privatevoidAddMsg(stringmsg)
if(txtMsg.InvokeRequired)
CallBackRefc=newCallBackRef(AddMsgCallBack);
this.Invoke(c,newobject[]{msg});
else
txtMsg.Text+=Environment.NewLine+msg;
privatevoidAddMsgCallBack(stringmsg)
voidAcceptedSocket_OnStringDataAccept(stringAccepterID,stringAcceptData)
try
//显示
//this.txtMsg.Text+=AccepterID+"
:
"
+AcceptData+Environment.NewLine;
MsgRefm=newMsgRef(AddMsg);
this.Invoke(m,newobject[]{AcceptData});
//转发
for(inti=0;
i<
clients.Count;
i++)
if(clients.Values[i].ID!
=AccepterID)
clients.Values[i].ASend(AcceptData);
catch(Exceptione)
MessageBox.Show(e.Message);
privatevoidbtnSend_Click(objectsender,EventArgse)
if(txtSend.Text=="
"
)
return;
clients.Values[i].ASend("
服务器:
+txtSend.Text+AsySocket.EndChar);
//txtMsg.Text+="
发送:
+txtSend.Text+Environment.NewLine;
AddMsg("
+txtSend.Text);
txtSend.Text="
;
txtSend.Focus();
}
客户端代码:
namespaceClient
publicdelegatevoidStreamDataAcceptHandler(stringAccepterID,byte[]AcceptData);
publicdelegatevoidStringDataAcceptHandler(stringAccepterID,stringAcceptData);
publicdelegatevoidAsySocketEventHandler(stringSenderID,stringEventMessage);
publicdelegatevoidAcceptEventHandler(AsySocketAcceptedSocket);
publicdelegatevoidAsySocketClosedEventHandler(stringSocketID,stringErrorMessage);
///<
summary>
///Stateobjectforreceivingdatafromremotedevice.
/summary>
publicclassStateObject
//Clientsocket.
publicSocketworkSocket=null;
//Sizeofreceivebuffer.
publicconstintBufferSize=1024;
//Receivebuffer.
publicbyte[]buffer=newbyte[BufferSize];
//Receiveddatastring.
publicStringBuildersb=newStringBuilder();
///文件名称:
AsySocket.cs
///描述:
异步传输对象
publicclassAsySocket
publicAsySocket(stringLocalIP,intLocalPort)
mSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddressip=Dns.GetHostAddresses(LocalIP)[0];
IPEndPointipe=newIPEndPoint(ip,LocalPort);
mID=Guid.NewGuid().ToString();
mSocket.Bind(ipe);
//ErrLog.RecordErr(e,ModuleName,"
AsySocket"
"
);
paramname="
LinkObject"
>
指定的Socket连接<
/param>
publicAsySocket(SocketlinkObject)
{mSocket=linkObject;
#region私有字段
privateSocketmSocket=null;
stringmID="
privateconststringModuleName="
GYGameServer.AsySocket"
privateStreamDataAcceptHandleronStreamData=null;
privateStringDataAcceptHandleronStringData=null;
privateAsySocketEventHandleronSended=null;
privateAsySocketEventHandleronSendTo=null;
privateAcceptEventHandleronAccept=null;
privateAsySocketClosedEventHandleronClosed=null;
#endregion
#region公共属性
publicstaticstringEndChar
get
returnnewstring((char)0,1);
publicstringID
returnmID;
///发送、接受数据的结尾标志
publicstaticcharLastSign
return(char)0;
///获取、设置连接对象
publicSocketLinkObject
returnmSocket;
set
mSocket=value;
#region公共方法
///监听
publicvoidListen(intbacklog)
if(mSocket==null)
thrownewArgumentNullException("
连接不存在"
mSocket.Listen(backlog);
mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);
//异步
///开始接受数据
publicvoidBeginAcceptData()
连接对象为空"
//开始接收数据
StateObjectstate=newStateObject();
state.workSocket=mSocket;
mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);
//receiveDone.WaitOne();
///发送二进制数据
SendData"
<
publicvoidASend(byte[]SendData)
if(SendData==null)
mSocket.BeginSend(SendData,0,SendData.Length,0,newAsyncCallback(SendCallBack),mSocket);
//sendDone.WaitOne();
///发送文本数据
publicvoidASend(stringSendData)
if(SendData.Length==0)
this.ASend(UTF8Encoding.UTF8.GetBytes(SendData));
///UDP发送二进制数据
EndPoint"
目标端点<
publicvoidASendTo(byte[]SendData,IPEndPointEndPoint)
mSocket.BeginSendTo(SendData,0,SendData.Length,0,EndPoint,newAsyncCallback(SendToCallBack),null);
//sendToDone.WaitOne();
///UDP发送文本数据
publicvoidASendTo(stringSendData,IPEndPointEndPoint)
ASendTo(UTF8Encoding.UTF8.GetBytes(SendData),EndPoint);
#region私有方法
privatevoidAcceptCallBack(IAsyncResultar)
Sockethandler=mSocket.EndAccept(ar);
AsySocketNewSocket=newAsySocket(handler);
//激发事件
if(onAccept!
=null)
onAccept(NewSocket);
//重新监听
privatevoidReceiveCallback(IAsyncResultar)
StateObjectstate=ar.AsyncStateasStateObject;
//读取数据
intbytesRead=mSocket.EndReceive(ar);
if(bytesRead>
0)
state.sb.Append(UTF8Encoding.UTF8.GetString(state.buffer,0,bytesRead));
stringsb=state.sb.ToString();
if(sb.Substring(sb.Length-1,1)==EndChar)
//接收完成
if(onStreamData!
onStreamData(mID,UTF8Encoding.UTF8.GetBytes(sb));
if(onStringData!
onStringData(mID,sb);
//
state=newStateObject();
//Gettherestofthedata.
catch(SocketExceptionse)
if(onClosed!
onClosed(ID,se.Message);
thrownewApplicationException(e.Message);
privatevoidSendCallBack(IAsyncResultar)
mSocket.EndSend(ar);
//sendDone.Set();
//触发事件
if(onSended!
onSended(mID,"
OK"
//thrownewApplicationException(e.Message);
privatevoidSendToCallBack(IAsyncResultar)
mSocket.EndSendTo(ar);
//sendToDone.Set();
if(onSendTo!
onSendTo(mID,"
#region事件
///连接关闭的事件
publiceventAsySocketClosedEventHandlerOnClosed
add
onClosed+=value;
remove
onClosed-=value;
///接受连接的事件
publiceventAcceptEventHandlerOnAccept
onAccept+=value;
onAccept-=value;
///接收二进制数据事件
publiceventStreamDataAcceptHandlerOnStreamDataAccept
this.onStreamData+=value;
this.onStreamData-=value;
///接收文本数据事件
publiceventStringDataAcceptHandlerOnStringDataAccept
onStringData+=value;
onStringData-=value;
///发送成功事件
publiceventAsySocketEventHandlerOnSended
onSended+=value;
onSended-=value;
///UTP发送成功事件
publiceventAsySocketEventHandlerOnSendTo
onSendTo+=value;
onSendTo-=value;