简易代码
public class SocketAsync
{
public delegate void TextShow(string context);
public delegate void GetPic(int i);
private static TextShow show;
private static GetPic pic;
public static void MainFunc(TextShow show1, GetPic pic1)
{
show = show1;
pic = pic1;
Socket serverSk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSk.Bind(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 6000));
serverSk.Listen(1);
SocketAsyncEventArgs AcceptSAE = new SocketAsyncEventArgs();
AcceptSAE.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptSAE_Completed);
serverSk.AcceptAsync(AcceptSAE);
}
static void AcceptSAE_Completed(object sender, SocketAsyncEventArgs e)
{
Socket serverSk = sender as Socket;
if (e.SocketError == SocketError.Success)
{
serverSk = e.AcceptSocket;
//发送的方法,暂时没用
//SocketAsyncEventArgs SendSAE = new SocketAsyncEventArgs();
//byte[] data = System.Text.Encoding.UTF8.GetBytes("OK,Just Put IT!");
//SendSAE.SetBuffer(data, 0, data.Length);
//SendSAE.Completed += new EventHandler<SocketAsyncEventArgs>(SendSAE_Completed);
SocketAsyncEventArgs RecieveSAE = new SocketAsyncEventArgs();
byte[] buffer = new byte[2048];//因为我们不知道上面的字符串究竟会场生多少字节,这里我们就设置一个理论上可以满足大小的值2046。
RecieveSAE.SetBuffer(buffer, 0, buffer.Length);
RecieveSAE.Completed += new EventHandler<SocketAsyncEventArgs>(RecieveSAE_Completed);
serverSk.ReceiveAsync(RecieveSAE);
//serverSk.SendAsync(SendSAE);
}
//else
//Console.WriteLine("接受网络套接字连接请求失败!具体原因请自己调试!");
}
static void RecieveSAE_Completed(object sender, SocketAsyncEventArgs e)
{
Socket sk = sender as Socket;
byte[] data = e.Buffer; //注意这里,如何取关联到套接字的发送接受的缓冲区中的值。
string res = System.Text.Encoding.UTF8.GetString(data);
string deviceIP = sk.RemoteEndPoint.ToString();
show($"接收客户端{deviceIP},消息{res}");
if (res.IndexOf("+OCCH_ALL") == 0)
{
string temp = res.Substring(res.IndexOf("+OCCH_ALL:") + 10, res.IndexOf("\n", 0) + 1 - (res.IndexOf("+OCCH_ALL:") + 10)).Replace("\n", "").Replace("\r", "");
if (temp == "0,1,0,0,0,0,0,0")
{
pic(1);
}
if (temp == "0,0,0,0,0,0,0,0")
{
pic(2);
}
}
//下一个异步接收
sk.ReceiveAsync(e);
}
//发送的方法,暂时没用
//static void SendSAE_Completed(object sender, SocketAsyncEventArgs e)
//{
// Socket sk = sender as Socket;
// if (e.SocketError == SocketError.Success)
// {
// //Console.WriteLine("Send complete!");
// byte[] data = e.Buffer; //注意这里,如何取关联到套接字的发送接受的缓冲区中的值。
// string msg = System.Text.Encoding.UTF8.GetString(data);
// //Console.WriteLine("What you sent: " + msg);
// }
//}
}
其中TextShow和GetPic是我要执行的方法,相当于DOsomething