网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月11日漏签0天
c#吧 关注:188,370贴子:822,531
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 6回复贴,共1页
<<返回c#吧
>0< 加载中...

学习笔记===================简单的UDP网络通信

  • 只看楼主
  • 收藏

  • 回复
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
UDP和TCP都是构建在IP层之上传输层的协议,
但UDP是一种简单、面向数据报(Sock_Dgram)的无连接协议,
提供的是不一定可靠的传输服务。
然而TCP是一种面向连接、可靠的,面向字节流(Sock_Stream)的传输协议,
对于“无连接”是指在正式通信前不必与对方先建立连接,
不管对方状态如何都可以直接发送过去(就如QQ中通过QQ号查看好友后发送添加好友请求,
此间不需要考虑对方的状态如何,都照样发送请求)。
从UDP和TCP的定义中就可以看出它们两者的区别了,
(1)UDP的可靠性不如TCP,因为TCP传输前要首先建立连接,
这样就增加了TCP传输的可靠性,所以UDP也被称为不可靠的传输协议,
(2)UDP不能保证有序传输。即UDP不能确保数据的发送和接收顺序。
UDP的工作原理
UDP将网络数据流量压缩成数据报的形式,每一个数据报用8个字节(8 X 8位=64位)描述报头信息,
剩余字节包含具体的传输数据。UDP报头(只有8个字节)相当于TCP的报头(至少20个字节)很短,
UDP报头由4个域组成,每个域各占2个字节,具体为源端口、目的端口、用户数据报长度和校验和
.net平台对UDP编程的支持
.net平台下对UDP编程也做了很好的支持,为我们开发基于UDP协议的网络应用提供很多方便之处,
.net平台下对UDP编程的支持(主要介绍提供的类来对UDP协议进行编程)。
.net类库中的UdpClient类对基础的Socket进行了封装,这样就在发送和接受数据时不需要考虑底层
套接字的收发时处理的一些细节问题,这样为UDP编程提供了方便,也可以提高开发效率(
感觉net就是做这样的事情的,对一些底层的实现进行封装,方便我们的调用,这也体现了面向对象语言的封装特性)


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace UDP编程
{
public partial class Form1 : Form
{
//创建一个接收一个发送UdpClient 类
private UdpClient sendudpClient;
private UdpClient receiveudpClient;
public Form1()
{
InitializeComponent();
//获得指定的主机的 Internet 协议 (IP) 地址。
IPAddress[] ips = Dns.GetHostAddresses("");
foreach(var ip in ips)
{
textBox1.Text = ip.ToString();
textBox2.Text = ip.ToString();
break;
}
//端口号
int port = 51882;
int sender = 11882;
textBox3.Text = port.ToString();
textBox4.Text = sender.ToString();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//// 接受消息
private void button4_Click(object sender, EventArgs e)
{
// 创建接收IP地址
IPAddress localIp = IPAddress.Parse(textBox1.Text);
//加上端口号
IPEndPoint LocaliPEndPoint = new IPEndPoint(localIp, int.Parse(textBox3.Text));
try
{
//初始化 UdpClient 类的新实例
receiveudpClient = new UdpClient(LocaliPEndPoint);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
//另起一个线程调用接收方法
Thread recethread = new Thread(ReceiveMessage);
recethread.Start();
}
//接收消息的方法
private void ReceiveMessage()
{
if (receiveudpClient == null) { return; }
//网络端点表示为IP 地址和端口号,设置成任何都可以
IPEndPoint remoteIpendPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
//接收由一台远程主机发送的 UDP 数据报
byte[] recbyte = receiveudpClient.Receive(ref remoteIpendPoint);
//将byte转换成string
string message = Encoding.Unicode.GetString(recbyte);
//利用委托实现跨线程界面操作
ShowMessage(listBox1, string.Format("{0}[{1}]", remoteIpendPoint, message));
} catch(Exception ex) { }
}
}
//定义一个委托
delegate void ShowMessageCallBack(ListBox listBox, string message);
//实现方法
private void ShowMessage(ListBox listBox,string text)
{
//当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
if (listBox.InvokeRequired)
{
ShowMessageCallBack showMessageCallBack = ShowMessage;
listBox.Invoke(showMessageCallBack, new object[] { listBox, text });
}
else
{
listBox1.Items.Add(text);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
listBox1.ClearSelected();
}
}
//发送消息
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox5.Text))
{
MessageBox.Show("发送消息不能为空");
return;
}
IPAddress localIp = IPAddress.Parse(textBox1.Text);
IPEndPoint iPEndPoint = new IPEndPoint(localIp, int.Parse(textBox3.Text));
sendudpClient = new UdpClient(iPEndPoint);
Thread thread = new Thread(SendMessage);
thread.Start(textBox5.Text);
}
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbyte = Encoding.Unicode.GetBytes(message);
IPAddress iPAddress = IPAddress.Parse(textBox2.Text);
IPEndPoint iPEnd = new IPEndPoint(iPAddress, int.Parse(textBox4.Text));
sendudpClient.Send(sendbyte, sendbyte.Length, iPEnd);
sendudpClient.Close();
ResetMessage(textBox5);
}
delegate void ResetMessageCallBack(TextBox text);
private void ResetMessage(TextBox text)
{
if (text.InvokeRequired)
{
ResetMessageCallBack resetMessageCallBack = ResetMessage;
text.Invoke(resetMessageCallBack, new object[] { text });
}
else
{
textBox5.Clear();
textBox5.Focus();
}
}
private void button3_Click(object sender, EventArgs e)
{
receiveudpClient.Close();
}
private void button2_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
}
}
}


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
2025-06-11 08:05:53
广告
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
以上是一个基于UDP的通信程序代码


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 叶岩儿
  • c#诠释者
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是……


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回c#吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示