TCP 必须建立在连接才可以进行通信,
UDP不需要建立通信
但两者都需要监听来接收消息
TCP是一种面向连接的、可靠的,基于字节流的传输层通信协议。为两台主机提供高可靠性的数据通信服务。它可以将源主机的数据无差错地传输到目标主机。当有数据要发送时,对应用进程送来的数据进行分片,以适合于在网络层中传输;当接收到网络层传来的分组时,它要对收到的分组进行确认,还要对丢失的分组设置超时重发等。为此TCP需要增加额外的许多开销,以便在数据传输过程中进行一些必要的控制,确保数据的可靠传输。因此,TCP传输的效率比较低。
UDP是一种简单的、面向数据报的无连接的协议,提供的是不一定可靠的传输服务。所谓“无连接”是指在正式通信前不必与对方先建立连接,不管对方状态如何都直接发送过去。这与发手机短信非常相似,只要知道对方的手机号就可以了,不要考虑对方手机处于什么状态。UDP虽然不能保证数据传输的可靠性,但数据传输的效率较高。
服务端
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 System.Net.Sockets;
using System.Net;
using System.Threading;
namespace UDP_windows_服务器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 获取本地IP
/// </summary>
private void label1_Click(object sender, EventArgs e)
{
string ip = IPAddress.Any.ToString();
textBox1.Text = ip;
}
Socket server;
private void button1_Click(object sender, EventArgs e)
{
//1.创建服务器端电话
server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2.创建手机卡
IPAddress iP = IPAddress.Parse(textBox1.Text);
IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));
//3.将电话卡插进电话中(绑定端口号和IP)
server.Bind(endPoint);
listBox1.Items.Add("服务器已经成功开启!");
//开启接收消息线程
Thread t = new Thread(ReciveMsg);
t.IsBackground = true;
t.Start();
}
/// <summary>
/// 向特定ip的主机的端口发送数据
/// </summary>te
void SendMsg()
{
//string hostName = Dns.GetHostName(); //获取本机名
//IPHostEntry localhost = Dns.GetHostEntry(hostName); //获取IPv6地址
//IPAddress localaddr = localhost.AddressList[0];
EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), int.Parse(textBox2.Text));
string msg = textBox3.Text;
server.SendTo(Encoding.UTF8.GetBytes(msg), point);
}
/// <summary>
/// 接收发送给本机ip对应端口号的数据
/// </summary>
void ReciveMsg()
{
while (true)
{
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
byte[] buffer = new byte[1024 * 1024];
int length = server.ReceiveFrom(buffer, ref point);//接收数据报
string message = Encoding.UTF8.GetString(buffer, 0, length);
listBox1.Items.Add(point.ToString() + ":" + message);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (textBox3.Text != "")
{
//开启发送消息线程
Thread t2 = new Thread(SendMsg);
t2.Start();
}
}
}
}
客户端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace UDP_windows_客户端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 创建客户端
/// </summary>
Socket client;
private void button1_Click(object sender, EventArgs e)
{
///创建客户端
client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress iP = IPAddress.Parse(textBox1.Text);
///端口号
IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));
///建立与服务器的远程连接
client.Connect(endPoint);
///线程问题
Thread thread = new Thread(ReciveMsg);
thread.IsBackground = true;
thread.Start(client);
listBox1.Items.Add("客户端已成功开启!");
}
/// <summary>
/// 向特定ip的主机的端口发送数据
/// </summary>
void SendMsg()
{
///获取IP与端口号
EndPoint point = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));
///发送内容
string msg = textBox3.Text;
///将数据发送到指定的ip的主机的端口
client.SendTo(Encoding.UTF8.GetBytes(msg), point);
}
/// <summary>
/// 接收发送给本机ip对应端口号的数据
/// </summary>
void ReciveMsg(object o)
{
Socket client = o as Socket;
while (true)
{
try
{
///用来保存发送方的ip和端口号
EndPoint point = new IPEndPoint(IPAddress.Any, 0);
///定义客户端接收到的信息大小
byte[] buffer = new byte[1024 * 1024];
///接收到的信息大小(所占字节数)
int length = client.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, length);
listBox1.Items.Add(point.ToString() + ":" + message);
}
catch (Exception)
{
client.Close();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (textBox3.Text != "")
{
//开启发送消息线程
Thread t2 = new Thread(SendMsg);
t2.Start();
}
listBox1.Items.Add(textBox3.Text);
}
}
}