c#Socket异步通信源码.docx
《c#Socket异步通信源码.docx》由会员分享,可在线阅读,更多相关《c#Socket异步通信源码.docx(15页珍藏版)》请在冰豆网上搜索。
c#Socket异步通信源码
服务器端代码:
namespaceServer
{
publicpartialclassServer2:
Form
delegatevoidMsgRef(stringmsg);
publicServer2()
InitializeComponent();
}
AsySocketlistener=null;
SortedListclients=newSortedList();
delegatevoidCallBackRef(stringmsg);
privatevoidbutton1_Click(objectsender,EventArgse)
//监听
listener=newAsySocket(this.textBox1.Text,Int32.Parse(textBox2.Text));
listener.OnAccept+=newAcceptEventHandler(listener_OnAccept);
listener.Listen(10);
this.button1.Enabled=false;
voidlistener_OnAccept(AsySocketAcceptedSocket)
//注册事件
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{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;//转发for(inti=0;i{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);//////Stateobjectforreceivingdatafromremotedevice.///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);try{IPAddressip=Dns.GetHostAddresses(LocalIP)[0];IPEndPointipe=newIPEndPoint(ip,LocalPort);mID=Guid.NewGuid().ToString();mSocket.Bind(ipe);}catch(Exceptione){//ErrLog.RecordErr(e,ModuleName,"AsySocket","");}}///指定的Socket连接publicAsySocket(SocketlinkObject){mSocket=linkObject;mID=Guid.NewGuid().ToString();}#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{get{returnmID;}}//////发送、接受数据的结尾标志///publicstaticcharLastSign{get{return(char)0;}}//////获取、设置连接对象///publicSocketLinkObject{get{returnmSocket;}set{mSocket=value;}}#endregion#region公共方法//////监听///publicvoidListen(intbacklog){if(mSocket==null)thrownewArgumentNullException("连接不存在");mSocket.Listen(backlog);mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);//异步}//////开始接受数据///publicvoidBeginAcceptData(){if(mSocket==null)thrownewArgumentNullException("连接对象为空");//开始接收数据StateObjectstate=newStateObject();state.workSocket=mSocket;mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);//receiveDone.WaitOne();}//////发送二进制数据//////publicvoidASend(byte[]SendData){if(mSocket==null)thrownewArgumentNullException("连接不存在");if(SendData==null)return;mSocket.BeginSend(SendData,0,SendData.Length,0,newAsyncCallback(SendCallBack),mSocket);//sendDone.WaitOne();}//////发送文本数据//////publicvoidASend(stringSendData){if(SendData.Length==0)return;this.ASend(UTF8Encoding.UTF8.GetBytes(SendData));}//////UDP发送二进制数据/////////目标端点publicvoidASendTo(byte[]SendData,IPEndPointEndPoint){if(mSocket==null)thrownewArgumentNullException("连接不存在");if(SendData==null)return;mSocket.BeginSendTo(SendData,0,SendData.Length,0,EndPoint,newAsyncCallback(SendToCallBack),null);//sendToDone.WaitOne();}//////UDP发送文本数据/////////publicvoidASendTo(stringSendData,IPEndPointEndPoint){if(SendData.Length==0)return;ASendTo(UTF8Encoding.UTF8.GetBytes(SendData),EndPoint);}#endregion#region私有方法privatevoidAcceptCallBack(IAsyncResultar){Sockethandler=mSocket.EndAccept(ar);AsySocketNewSocket=newAsySocket(handler);//激发事件if(onAccept!=null)onAccept(NewSocket);//重新监听mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);}privatevoidReceiveCallback(IAsyncResultar){try{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!=null)onStreamData(mID,UTF8Encoding.UTF8.GetBytes(sb));if(onStringData!=null)onStringData(mID,sb);//state=newStateObject();state.workSocket=mSocket;}//Gettherestofthedata.mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);}}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){thrownewApplicationException(e.Message);}}privatevoidSendCallBack(IAsyncResultar){try{mSocket.EndSend(ar);//sendDone.Set();//触发事件if(onSended!=null)onSended(mID,"OK");}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){//thrownewApplicationException(e.Message);}}privatevoidSendToCallBack(IAsyncResultar){try{mSocket.EndSendTo(ar);//sendToDone.Set();if(onSendTo!=null)onSendTo(mID,"OK");}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){thrownewApplicationException(e.Message);}}#endregion#region事件//////连接关闭的事件///publiceventAsySocketClosedEventHandlerOnClosed{add{onClosed+=value;}remove{onClosed-=value;}}//////接受连接的事件///publiceventAcceptEventHandlerOnAccept{add{onAccept+=value;}remove{onAccept-=value;}}//////接收二进制数据事件///publiceventStreamDataAcceptHandlerOnStreamDataAccept{add{this.onStreamData+=value;}remove{this.onStreamData-=value;}}//////接收文本数据事件///publiceventStringDataAcceptHandlerOnStringDataAccept{add{onStringData+=value;}remove{onStringData-=value;}}//////发送成功事件///publiceventAsySocketEventHandlerOnSended{add{onSended+=value;}remove{onSended-=value;}}//////UTP发送成功事件///publiceventAsySocketEventHandlerOnSendTo{add{onSendTo+=value;}remove{onSendTo-=value;}}#endregion}}
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;
for(inti=0;i{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);//////Stateobjectforreceivingdatafromremotedevice.///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);try{IPAddressip=Dns.GetHostAddresses(LocalIP)[0];IPEndPointipe=newIPEndPoint(ip,LocalPort);mID=Guid.NewGuid().ToString();mSocket.Bind(ipe);}catch(Exceptione){//ErrLog.RecordErr(e,ModuleName,"AsySocket","");}}///指定的Socket连接publicAsySocket(SocketlinkObject){mSocket=linkObject;mID=Guid.NewGuid().ToString();}#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{get{returnmID;}}//////发送、接受数据的结尾标志///publicstaticcharLastSign{get{return(char)0;}}//////获取、设置连接对象///publicSocketLinkObject{get{returnmSocket;}set{mSocket=value;}}#endregion#region公共方法//////监听///publicvoidListen(intbacklog){if(mSocket==null)thrownewArgumentNullException("连接不存在");mSocket.Listen(backlog);mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);//异步}//////开始接受数据///publicvoidBeginAcceptData(){if(mSocket==null)thrownewArgumentNullException("连接对象为空");//开始接收数据StateObjectstate=newStateObject();state.workSocket=mSocket;mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);//receiveDone.WaitOne();}//////发送二进制数据//////publicvoidASend(byte[]SendData){if(mSocket==null)thrownewArgumentNullException("连接不存在");if(SendData==null)return;mSocket.BeginSend(SendData,0,SendData.Length,0,newAsyncCallback(SendCallBack),mSocket);//sendDone.WaitOne();}//////发送文本数据//////publicvoidASend(stringSendData){if(SendData.Length==0)return;this.ASend(UTF8Encoding.UTF8.GetBytes(SendData));}//////UDP发送二进制数据/////////目标端点publicvoidASendTo(byte[]SendData,IPEndPointEndPoint){if(mSocket==null)thrownewArgumentNullException("连接不存在");if(SendData==null)return;mSocket.BeginSendTo(SendData,0,SendData.Length,0,EndPoint,newAsyncCallback(SendToCallBack),null);//sendToDone.WaitOne();}//////UDP发送文本数据/////////publicvoidASendTo(stringSendData,IPEndPointEndPoint){if(SendData.Length==0)return;ASendTo(UTF8Encoding.UTF8.GetBytes(SendData),EndPoint);}#endregion#region私有方法privatevoidAcceptCallBack(IAsyncResultar){Sockethandler=mSocket.EndAccept(ar);AsySocketNewSocket=newAsySocket(handler);//激发事件if(onAccept!=null)onAccept(NewSocket);//重新监听mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);}privatevoidReceiveCallback(IAsyncResultar){try{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!=null)onStreamData(mID,UTF8Encoding.UTF8.GetBytes(sb));if(onStringData!=null)onStringData(mID,sb);//state=newStateObject();state.workSocket=mSocket;}//Gettherestofthedata.mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);}}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){thrownewApplicationException(e.Message);}}privatevoidSendCallBack(IAsyncResultar){try{mSocket.EndSend(ar);//sendDone.Set();//触发事件if(onSended!=null)onSended(mID,"OK");}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){//thrownewApplicationException(e.Message);}}privatevoidSendToCallBack(IAsyncResultar){try{mSocket.EndSendTo(ar);//sendToDone.Set();if(onSendTo!=null)onSendTo(mID,"OK");}catch(SocketExceptionse){if(onClosed!=null)onClosed(ID,se.Message);}catch(Exceptione){thrownewApplicationException(e.Message);}}#endregion#region事件//////连接关闭的事件///publiceventAsySocketClosedEventHandlerOnClosed{add{onClosed+=value;}remove{onClosed-=value;}}//////接受连接的事件///publiceventAcceptEventHandlerOnAccept{add{onAccept+=value;}remove{onAccept-=value;}}//////接收二进制数据事件///publiceventStreamDataAcceptHandlerOnStreamDataAccept{add{this.onStreamData+=value;}remove{this.onStreamData-=value;}}//////接收文本数据事件///publiceventStringDataAcceptHandlerOnStringDataAccept{add{onStringData+=value;}remove{onStringData-=value;}}//////发送成功事件///publiceventAsySocketEventHandlerOnSended{add{onSended+=value;}remove{onSended-=value;}}//////UTP发送成功事件///publiceventAsySocketEventHandlerOnSendTo{add{onSendTo+=value;}remove{onSendTo-=value;}}#endregion}}
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);
///
///Stateobjectforreceivingdatafromremotedevice.
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","");
///指定的Socket连接
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()
thrownewArgumentNullException("连接对象为空");
//开始接收数据
StateObjectstate=newStateObject();
state.workSocket=mSocket;
mSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(ReceiveCallback),state);
//receiveDone.WaitOne();
///发送二进制数据
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发送二进制数据
///目标端点
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);
//重新监听
mSocket.BeginAccept(newAsyncCallback(AcceptCallBack),null);
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,"OK");
#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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1