网络编程Socket 异步发送接收

using System.Net.Sockets;

1.建立Socket 

Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtoclType.UDP);

说明:AddressFamily.InterNetwork 指定当前Socket采用Ipv4协议

          SocketType.Dgram 指定采用数据报通讯模式(锁定UDP /TCP)

          ProtoclType.UDP 指定采用UDP模式

2.建立Endpoint,该对象包含IP和端口

EndPoint localEP=new IPEndpoint(Address.Parse("127.0.0.1"),10020);

说明: Address.Parse() 把字符串格式的IP转换成IPAddress对象,

           10020 端口 

3.socket.Bind(localEP)

说明:Socket对象绑定监听地址和端口

4.建立State对象,目标是为了异步调用作为参数传入,并把当前的Socket传递给异步回调方法

State state=new State(socket)

State类定义如下:

public class State{

  public byte[] Buffer{get;private set;}  //定义缓冲区

  public Socket Socket{get;private set;} //定义Socket属性

  public EndPoint RemoteEP;  //对方的网络信息

  public State(Socket socket)

  {

    this.Buffer=new byte[10240];  //初始化缓冲区大小为1k字节

    this.Socket=socket;//保存本地Socket对象

    this.RemoteEP=new IPEndPoint(IPAddress.Any,0);

  }

}

5.异步接收(本地Socket对象接收数据处理)

socket.BeginReceive(state.Buffer,0,stateBuffer.Length,SocketFlags.None,new AsyncCllback(EndReceiveFromCallback),state);

6.接收数据委托方法

private static void EndReceiveFromCallback(IAsyncResult ar)

{

   State state=ar.AsyncState as State;

   Socket socket=state.Socket;

   byte[] RecBakSendBytes=new byte[10240];//接收缓冲区大小

   try

   {

     int byteRead=socket.EndReceive(ar); //异步接收

     ar.AsyncWaitHandle.Close();//接收完毕后关闭端口

    if(byteRead>0)

    {

         string recStr=Encoding.default.GetString(state.Buffer,0,byteRead);

         ProcessJSON(recStr);

    }

   }

}

 

效果:

 

 

完整源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinNetTest.Net;
namespace WinNetTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void groupBox1_Enter(object sender, EventArgs e)
{

}

private void Form1_Load(object sender, EventArgs e)
{
NetHelper.Ip = tbIP.Text;
NetHelper.RemoteIp = tbRIp.Text;
NetHelper.Port = Int32.Parse(tbPort.Text);
NetHelper.RemotePort = Int32.Parse(tbRPort.Text);
NetHelper.ProcessJSON += (string msg) => {
this.tbRecevied.Invoke((Action)delegate
{
this.tbRecevied.Text = msg;
});
};
}

private void btnStart_Click(object sender, EventArgs e)
{
NetHelper.RecvThread();
btnStart.Enabled = false;
}

private void btnSend_Click(object sender, EventArgs e)
{
NetHelper.SendMsg(tbSendContent.Text);
}
}
}

NetHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using WinNetTest.Net;
namespace WinNetTest.Net
{
public static class NetHelper
{
public static event Action<XmlNode> InEvp;
public static event Action<string> ProcessJSON;
public static int Port { get; set; }
public static string Ip { get; set; }
public static int RemotePort { get; set; }
public static string RemoteIp { get; set; }
/// <summary>
/// 侦听接收数据
/// </summary>
public static void RecvThread()
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint localEP = new IPEndPoint(IPAddress.Parse(Ip), Port);
socket.Bind(localEP);
State state = new State(socket);
socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveFromCallback), state);
}
catch (Exception ex)
{

}
}

public static void SendMsg(string sendStr)
{
UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any,0));
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(RemoteIp), RemotePort);
byte[] buf = Encoding.Default.GetBytes(sendStr);
client.Send(buf, buf.Length, endpoint);
}

private static void EndReceiveFromCallback(IAsyncResult ar)
{
State state = ar.AsyncState as State;
Socket socket = state.Socket;
byte[] RecBakSendBytes = new byte[10240];
try
{
int byteRead = socket.EndReceive(ar);
ar.AsyncWaitHandle.Close();
if (byteRead > 0)
{
string recStr = Encoding.Default.GetString(state.Buffer, 0, byteRead);
LogHelper.WriteLog(recStr);
ProcessJSON(recStr);
}
}
catch (Exception ex)
{

}
finally
{
socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveFromCallback), state);
}
}
}
}

State.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
namespace WinNetTest.Net
{
public class State
{
public byte[] Buffer { get; private set; }
public Socket Socket { get; private set; }
public EndPoint RemoteEP;
public State(Socket socket)
{
this.Buffer = new byte[10240];
this.Socket = socket;
this.RemoteEP = new IPEndPoint(IPAddress.Any, 0);

}
}
}

LogHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace WinNetTest.Net
{
public class LogHelper
{
public static void WriteLog(string content, string filename = "log") {
string dir=Environment.CurrentDirectory+"\\"+filename;
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
string path = dir + "\\" + DateTime.Now.ToString("yyyyMMdd")+".txt";
if (!File.Exists(path)) {
File.CreateText(path);
}
using (FileStream fs = new FileStream(path,FileMode.Append,FileAccess.Write,FileShare.None))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("时间:" + DateTime.Now.ToLongTimeString());
sw.WriteLine(content);
sw.Flush();
}
}

}
}
}

 

posted @ 2020-07-30 16:55  丹心石  阅读(1105)  评论(0编辑  收藏  举报