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();
}
}
}
}
}