基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)
使用Udp协议通讯需要具备以下几个条件:
(1).建立一个套接字(Socket)
(2).绑定服务器端IP地址及端口号--服务器端
(3).通过SendTo()方法向指定主机发送消息 (需提供主机IP地址及端口)
(4).通过ReciveFrom()方法接收指定主机发送的消息 (需提供主机IP地址及端口)
下面用代码实现简单的服务器---客户端通信
服务器端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _023_socket编程_UDP协议_服务器端 {
class Program
{
private static Socket udpServer;
static void Main(string[] args) {
//1,创建socket
udpServer = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2,绑定ip跟端口号
udpServer.Bind( new IPEndPoint ( IPAddress.Parse("192.168.1.101") ,7788 ) );
//3,接收数据
new Thread(ReceiveMessage){ IsBackground = true}.Start();
Console.WriteLine("服务器启动...");
Console.ReadKey();
}
static void ReceiveMessage()
{
while (true)
{
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];
int length = udpServer.ReceiveFrom (data, ref remoteEndPoint);//这个方法会把数据的来源(ip:port)放到第二个参数上
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("从ip:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "收到了数据:" + message);
}
}
}
}
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace _002_socket编程_udp协议_客户端 {
class Program {
static void Main(string[] args) {
//创建socket
Socket udpClient = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
while (true)
{
//发送数据
EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 7788);
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
udpClient.SendTo(data, serverPoint);
}
udpClient.Close();
Console.ReadKey();
}
}
}
|
执行过程:
(1)启动服务器
(2)启动客户端,并向服务器发送数据
//***************************2*************
C#使用UDP实现服务器与客户端通信
TCP 必须建立在连接才可以进行通信,
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)
///用来保存发送方的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);
private void Form1_Load(object sender, EventArgs e)
C# 委托方式(类似事件响应,添加了MessageHandler的都可以接收到数据)实现的UDP服务器,可在多个Form接收UDP客户端发送过来的数据,在需要多个地方用到客接收数据的时候非常方便。完整的C#代码,VS2008工程。
TCP也可以参考类似实现。
上次利用代码在一台电脑实现了TCP协议创建服务器端和客户端并进行通信,这次我们来用UDP协议进行实现。(建议先了解TCP协议如何实现数据传输)
(传送门:https://blog.csdn.net/wang568270833/article/details/89764756)
TCP协议和UDP协议有什么区别呢?这里先简单的说一下,TCP协议在收发数据之前有一个连接的功能,就是在服务器端调用A...
文章目录一、通过控制台直接发送数据1.创建新的C#控制台程序2.客户端代码3.服务器代码4.运行结果二、创建简单可视化界面进行通信1.创建新的窗体应用
一、通过控制台直接发送数据
1.创建新的C#控制台程序
2.客户端代码
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
class Program
static void Main
Console.WriteLine("------startUdpReceive--");
udpServer = new Socket(AddressFamily.Inter
基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)
使用Udp协议通讯需要具备以下几个条件:
(1).建立一个套接字(Socket)
(2).绑定服务器端IP地址及端口号--服务器端
(3).通过SendTo()方法向指定主机发送消息 (需提供主机IP地址及端口)
(4).通过ReciveFrom()方法...
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.F...
问:socket异步接收数据? 1、客户端发送给服务器的字节长度大于服务器接收默认的字节长度的话,服务器会...
答:客户端接收缓冲区设置多大就接收多大的数据包,当然发送端发送数据大于客户端缓冲区时,接收函数完成一次接收后会返回当前数据大小,你可以根据返回的做循环...
问:C#socket循环接收 socket接收数据如果对方没有返回 Recv。方法回阻塞线程而且会卡死
01是序列号,他要识别哪两个是一对,就通过01 10识别,01 10是一对 02 20是一对0+ +0是一对,一个服务器可以给很多客户端服务。大概意思就是:客户端A,B通过IP公网(类似中介)来通讯,A发信息给服务器→服务器转发给B。AT+CWJAP="hcm","123456789"//WIFI连接。2. 打开我们写好的C#服务端,将他运行起来(没有的可以私信我)3.打开串口助手(接上8266,并连接wifi)不懂的可以看→。AT+CIPMODE=1//开启透传模式。
这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.
1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:
2.在服务端和客户端分别加入如下代码:
基于UDP的文件传输软件 (C#)
选了一门软件开发案例的选修课,得到一项多选一大作业,我们选择了“基于UDP的文件传输系统”这个作业,然后经过需求分析和概要设计,进入编码阶段,因为作业要求有界面,个人认为用C#编写桌面软件比较容易,就选择了C#而非Java做这个作业(主要是Java编写桌面软件我不会)。
这篇博文的目的在于解释大作业的结构,放上一些需求分析和概要设计的成果,结合代码,所以
这里一定要注意TCP/IP是指一堆协议的集合,而这些集合之中又属TCP协议和IP协议比较重要,所以就将此协议集合以TCP/IP的方式进行命名。
那么UDP协议和TCP协议有什么区别呢?
TCP协议是面向连接的协议,A端到B端要传输数据则需要进行三次握手建立连接,之后便是点对点的数据通讯,对于数据来说是可靠的。
而UDP协议是一种非连接的协议
在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。