UDP是.net內置的socket方法
採用UDP可以實現不同應用的相互通信
接收方監聽的IP+端口號只能開啟一個
Client
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace UDPClient
{
public partial class Form1 : Form
{
UdpClient udpClient = null;
public delegate void UpdateMsgUI(object objx);
public UpdateMsgUI updateMsgListUI;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//441 接收消息 114發送消息
//创建UDPClient对象
udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 441));
updateMsgListUI = new UpdateMsgUI(SetMsgListText);
Thread m_SplashThread = new Thread(new ThreadStart(delegate()
{
Recive();
}));
m_SplashThread.IsBackground = true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start();
}
private void SetMsgListText(object objx)
{
if (richTextBox1.Lines.Length > 1000)
richTextBox1.Clear();
richTextBox1.AppendText(objx.ToString());
richTextBox1.AppendText(System.Environment.NewLine);
}
private void button1_Click(object sender, EventArgs e)
{
//發消息 通過114端口發消息
string Str = this.richTextBox2.Text;
byte[] data = Encoding.UTF8.GetBytes(Str); //将输入的字符串转化成字符数组
udpClient.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 114)); //建立发送函数 出入需要发送的数据
}
private void button2_Click(object sender, EventArgs e)
{
//关闭端口
if (udpClient != null)
{
udpClient.Close();
}
}
/// <summary>
/// 通過441端口收消息
/// </summary>
private void Recive()
{
while (true)
{
//接收数据
IPEndPoint point = new IPEndPoint(IPAddress.Any, 0); // 这里创建一个接受IP和端口号的对象传入到第一步的参数中去
byte[] data = udpClient.Receive(ref point); //接受数据函数 第一个参数是指定一个IP地址和端口号
//转化数据为能够输出的字符串
string message = Encoding.UTF8.GetString(data); //先将字符数组转化成能够输出的字符串
this.BeginInvoke(updateMsgListUI, message);
}
}
}
}
Server
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace UDPServer
{
public partial class Form1 : Form
{
public delegate void UpdateMsgUI(object objx);
public UpdateMsgUI updateMsgListUI;
bool isStop = false;
UdpClient udpClient =null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
updateMsgListUI = new UpdateMsgUI(SetMsgListText);
}
private void SetMsgListText(object objx)
{
if (richTextBox1.Lines.Length > 1000)
richTextBox1.Clear();
richTextBox1.AppendText(objx.ToString());
richTextBox1.AppendText(System.Environment.NewLine);
}
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
updateMsgListUI("啟動");
isStop = false;
Thread m_SplashThread = new Thread(new ThreadStart(delegate()
{
Run();
}));
m_SplashThread.IsBackground = true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start();
}
private void Run()
{
//114接收消息 441發送消息
//创建UDPClient对象而且绑定IP和端口号-服务端
udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 114));
//建立死循环让用户可以重复接受
while (true)
{
if (isStop)
{
break;
}
//接收数据
IPEndPoint point = new IPEndPoint(IPAddress.Any, 0); //2.2 这里创建一个接受IP和端口号的对象传入到第一步的参数中去
byte[] data = udpClient.Receive(ref point); //2.1接受数据函数 第一个参数是指定一个IP地址和端口号
//转化数据为能够输出的字符串
string Str = Encoding.UTF8.GetString(data); //3.1先将字符数组转化成能够输出的字符串
this.BeginInvoke(updateMsgListUI, Str);
Rpley(Str);
}
}
private void Rpley(string Str)
{
Str = "收到" + Str;
byte[] Senddata = Encoding.UTF8.GetBytes(Str); //将输入的字符串转化成字符数组
udpClient.Send(Senddata, Senddata.Length, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 441)); //建立发送函数 出入需要发送的数据
}
private void button2_Click(object sender, EventArgs e)
{
button1.Enabled = true;
isStop = true;
//关闭一下数据连接
udpClient.Close();
}
}
}