admin 管理员组文章数量: 1086019
2024年3月14日发(作者:ios最新版本是多少)
服务器端代码:
namespace Server
{
public partial class Server2 : Form
{
delegate void MsgRef(string msg);
public Server2()
{
InitializeComponent();
}
AsySocket listener = null;
SortedList
delegate void CallBackRef(string msg);
private void button1_Click(object sender, EventArgs e)
{
//监听
listener = new AsySocket(, ());
pt += new AcceptEventHandler(listener_OnAccept);
(10);
d = false;
}
void listener_OnAccept(AsySocket AcceptedSocket)
{
//注册事件
ngDataAccept += new StringDataAcceptHandler(AcceptedSocket_OnStringDataAccept);
ed += new AsySocketClosedEventHandler(AcceptedSocket_OnClosed);
cceptData();
//加入
(, AcceptedSocket);
}
void AcceptedSocket_OnClosed(string SocketID, string ErrorMessage)
{
//客户端关闭
(SocketID);
}
private void AddMsg(string msg)
{
if (Required)
{
CallBackRef c = new CallBackRef(AddMsgCallBack);
(c, new object[] { msg });
}
else
{
+= e + msg;
}
}
private void AddMsgCallBack(string msg)
{
+= e + msg;
}
void AcceptedSocket_OnStringDataAccept(string AccepterID, string AcceptData)
{
try
{
//显示
// += AccepterID + ": " + AcceptData + e;
MsgRef m = new MsgRef(AddMsg);
(m, new object[] { AcceptData });
//转发
for (int i = 0; i < ; i++)
{
if ([i].ID != AccepterID)
{
[i].ASend(AcceptData);
}
}
}
catch (Exception e)
{
(e);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if ( == "")
return;
//转发
for (int i = 0; i < ; i++)
{
[i].ASend("服务器:" + + r);
}
// += "发送:" + + e;
AddMsg("发送:" + );
= "";
();
}
}
}
客户端代码:
namespace Client
{
public delegate void StreamDataAcceptHandler(string AccepterID, byte[] AcceptData);
public delegate void StringDataAcceptHandler(string AccepterID, string AcceptData);
public delegate void AsySocketEventHandler(string SenderID, string EventMessage);
public delegate void AcceptEventHandler(AsySocket AcceptedSocket);
public delegate void AsySocketClosedEventHandler(string SocketID, string ErrorMessage);
///
/// State object for receiving data from remote device.
///
public class StateObject
{
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}
///
/// 文件名称:
/// 描 述:异步传输对象
///
public class AsySocket
{
public AsySocket(string LocalIP, int LocalPort)
{
mSocket = new Socket(etwork, , );
try
{
IPAddress ip = tAddresses(LocalIP)[0];
IPEndPoint ipe = new IPEndPoint(ip, LocalPort);
mID = d().ToString();
(ipe);
}
catch (Exception e)
{
//Err(e, ModuleName, "AsySocket", "");
}
}
/// 指定的Socket连接
public AsySocket(Socket linkObject)
{ mSocket = linkObject;
mID = d().ToString();
}
#region 私有字段
private Socket mSocket = null;
string mID = "";
private const string ModuleName = "ket";
private StreamDataAcceptHandler onStreamData = null;
private StringDataAcceptHandler onStringData = null;
private AsySocketEventHandler onSended = null;
private AsySocketEventHandler onSendTo = null;
private AcceptEventHandler onAccept = null;
private AsySocketClosedEventHandler onClosed = null;
#endregion
#region 公共属性
public static string EndChar
{
get
{
return new string((char)0, 1);
}
}
public string ID
{
get
{
return mID;
}
}
///
/// 发送、接受数据的结尾标志
///
public static char LastSign
{
get
{
return (char)0;
}
}
///
/// 获取、设置连接对象
///
public Socket LinkObject
{
get
{
return mSocket;
}
set
{
mSocket = value;
}
}
#endregion
#region 公共方法
///
/// 监听
///
public void Listen(int backlog)
{
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
(backlog);
ccept(new AsyncCallback(AcceptCallBack), null);//异步
}
///
/// 开始接受数据
///
public void BeginAcceptData()
{
if (mSocket == null)
throw new ArgumentNullException("连接对象为空");
//开始接收数据
StateObject state = new StateObject();
cket = mSocket;
eceive(, 0, Size, 0, new AsyncCallback(ReceiveCallback), state);
//e();
}
///
/// 发送二进制数据
///
///
public void ASend(byte[] SendData)
{
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
if (SendData == null)
return;
end(SendData, 0, , 0, new AsyncCallback(SendCallBack), mSocket);
//e();
}
///
/// 发送文本数据
///
///
public void ASend(string SendData)
{
if ( == 0)
return;
(es(SendData));
}
///
/// UDP发送二进制数据
///
///
/// 目标端点
public void ASendTo(byte[] SendData, IPEndPoint EndPoint)
{
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
if (SendData == null)
return;
endTo(SendData, 0, , 0, EndPoint, new AsyncCallback(SendToCallBack), null);
//e();
}
///
/// UDP发送文本数据
///
///
///
public void ASendTo(string SendData, IPEndPoint EndPoint)
{
if ( == 0)
return;
ASendTo(es(SendData), EndPoint);
}
#endregion
#region 私有方法
private void AcceptCallBack(IAsyncResult ar)
{
Socket handler = ept(ar);
AsySocket NewSocket = new AsySocket(handler);
//激发事件
if (onAccept != null)
onAccept(NewSocket);
//重新监听
ccept(new AsyncCallback(AcceptCallBack), null);
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = tate as StateObject;
//读取数据
int bytesRead = eive(ar);
if (bytesRead > 0)
{
(ing(, 0, bytesRead));
string sb = ng();
if (ing( - 1, 1) == EndChar)
{
//接收完成
//激发事件
if (onStreamData != null)
onStreamData(mID, es(sb));
if (onStringData != null)
onStringData(mID, sb);
//
state = new StateObject();
cket = mSocket;
}
// Get the rest of the data.
eceive(, 0, Size, 0, new AsyncCallback(ReceiveCallback),
state);
}
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(ID, e);
}
catch (Exception e)
{
throw new ApplicationException(e);
}
}
private void SendCallBack(IAsyncResult ar)
{
try
{
d(ar);
//();
//触发事件
if (onSended != null)
onSended(mID, "OK");
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(ID, e);
}
catch (Exception e)
{
//throw new ApplicationException(e);
}
}
private void SendToCallBack(IAsyncResult ar)
{
try
{
dTo(ar);
//();
if (onSendTo != null)
onSendTo(mID, "OK");
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(ID, e);
}
catch (Exception e)
{
throw new ApplicationException(e);
}
}
#endregion
#region 事件
///
/// 连接关闭的事件
///
public event AsySocketClosedEventHandler OnClosed
{
add
{
onClosed += value;
}
remove
{
onClosed -= value;
}
}
///
/// 接受连接的事件
///
public event AcceptEventHandler OnAccept
{
add
{
onAccept += value;
}
remove
{
onAccept -= value;
}
}
///
/// 接收二进制数据事件
///
public event StreamDataAcceptHandler OnStreamDataAccept
{
add
{
amData += value;
}
remove
{
amData -= value;
}
}
///
/// 接收文本数据事件
///
public event StringDataAcceptHandler OnStringDataAccept
{
add
{
onStringData += value;
}
remove
{
onStringData -= value;
}
}
///
/// 发送成功事件
///
public event AsySocketEventHandler OnSended
{
add
{
onSended += value;
}
remove
{
onSended -= value;
}
}
///
/// UTP发送成功事件
///
public event AsySocketEventHandler OnSendTo
{
add
{
onSendTo += value;
}
remove
{
onSendTo -= value;
}
}
#endregion
}
}
版权声明:本文标题:c#Socket异步通信源码 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710388442a570843.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论