C# udp通信问题

william_chwenyu 2011-03-15 08:41:29
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
InitializeComponent();
udpClient = new UdpClient();
ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
udpClient.Client.Connect(ipEndPoint);
}

private void button1_Click(object sender, EventArgs e)
{
if (udpClient.Client.Connected)
{

byte[] mybyte = Encoding.Default.GetBytes("this is my firs udp message");
int t = udpClient.Send(mybyte, mybyte.Length, ipEndPoint);
if (t == 0)
{
MessageBox.Show("failed");
}
}
else
{
MessageBox.Show("failed");
}
}

}

接收端:
public partial class Form1 : Form
{
UdpClient udpServer;
IPEndPoint ipEndPoint;

public Form1()
{
InitializeComponent();
udpServer = new UdpClient();
ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
udpServer.Client.Connect(ipEndPoint);

Thread thread = new Thread(new ThreadStart(Listener));
thread.IsBackground = true;
thread.Start();
}

private void Listener()
{
while (udpServer != null)
{
try
{
byte[] message = udpServer.Receive(ref ipEndPoint);
string txt = Encoding.UTF8.GetString(message);
Debug.WriteLine("--------------" + txt);
this.textBox1.Text += txt + Environment.NewLine;
}
catch
{
break;
}
}
}

}
在调试程序的时候老是卡在byte[] message = udpServer.Receive(ref ipEndPoint);
这条语句上不往下执行了,希望大哥大姐们帮忙解决解决。。。、
再次感谢
...全文
190 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkghost 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 william_chwenyu 的回复:]

十分感谢17楼,顺利解决问题,说白了啥子问题都没有就是线程里面不能对txtbox进行操作。。。。
[/Quote]
跨线程访问UI控件要实用Invoke或者BeginInvoke。
Alden 2011-03-16
  • 打赏
  • 举报
回复
有数据到达时应该就会继续往下执行.
yangyi_33855 2011-03-16
  • 打赏
  • 举报
回复
楼主加个线程试试?楼上正解!绝对的!
walkghost 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 uc_xkj 的回复:]

帮顶,我也在搞这个问题,不过我想能过SOCKET实现,而不用封装好的UdpClient 听前辈说这个不是很稳定,不如用SOCKET直接实现的好
[/Quote]
不是稳定不稳定的问题,据我所知,TCPClien和UDPClient都是经过微软封装过的,使用起来更简单。
walkghost 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 william_chwenyu 的回复:]
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
InitializeComponent();
udpClie……
[/Quote]
因为Receive方法是同步阻止模式下的接收数据方法,我猜楼主你没有看MSDN里关于UDPClient的Receive方法的介绍吧?
这个同步阻止模式就是,直到UDPClient收到ipEndPoint 这个终端发送的数据之前,程序会一直阻塞在此处,所以它才会一直卡在这里。如果你想让程序走到这里后继续往下运行,你就应该用异步的接收方法或者使用线程,在线程里接收数据,这样界面也不会卡了。
william_chwenyu 2011-03-16
  • 打赏
  • 举报
回复
怎么没人呀。。。
uc_xkj1 2011-03-16
  • 打赏
  • 举报
回复
帮顶,我也在搞这个问题,不过我想能过SOCKET实现,而不用封装好的UdpClient 听前辈说这个不是很稳定,不如用SOCKET直接实现的好
三岁、就很帅 2011-03-16
  • 打赏
  • 举报
回复
现在不能上机调试 不在公司哦
william_chwenyu 2011-03-16
  • 打赏
  • 举报
回复
十分感谢17楼,顺利解决问题,说白了啥子问题都没有就是线程里面不能对txtbox进行操作。。。。
戒指 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 walkghost 的回复:]

下面的两个函数是上面的代码里调用的显示消息或异常消息的函数。
C# code


#region 消息
/// <summary>
/// 显示消息记录及写日志
/// </summary>
/// <param name="msg"></param>
private static void Sh……
[/Quote]这个方法简单易懂~
walkghost 2011-03-16
  • 打赏
  • 举报
回复
下面的两个函数是上面的代码里调用的显示消息或异常消息的函数。


#region 消息
/// <summary>
/// 显示消息记录及写日志
/// </summary>
/// <param name="msg"></param>
private static void ShowMsg(string msg)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss.fff") + ": " + msg);

}
/// <summary>
/// 显示消息记录及写日志
/// </summary>
/// <param name="msg"></param>
private static void ShowExecptionMsg(Exception ex)
{
Console.WriteLine("[异常]" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss.fff") + ": " + ex.ToString());

}
#endregion

walkghost 2011-03-16
  • 打赏
  • 举报
回复
另外我仔细看了下,你的接收端并不是真正的接收端,没有监听具体的端口号(应当在实例化UDPServer的时候用一个端口号作为参数实例化)。
一下是我写的测试程序代码,你参考下吧。
在main函数里调用Init(你要监听的端口号)即可。

/// <summary>
/// 初始化程序
/// </summary>
/// <param name="port">要监听的端口号</param>
static void Init(int port)
{
udpserver = new UdpClient(port);
ShowMsg("正在监听端口:"+port.ToString());
IPEndPoint AllIPEndPoint=new IPEndPoint(IPAddress.Broadcast,0);
byte[] Receive=new byte[0];
try
{
while (true)
{
System.Threading.Thread.Sleep(20);
int iReceiveCount = 0;

Receive = udpserver.Receive(ref AllIPEndPoint);
if (Receive.Length > 0)
{
//w
try
{
ShowMsg("收到数据(" + AllIPEndPoint.ToString() + ") " + NomalFunction.ByteArrayToHexString(Receive));
}
catch (Exception ex)
{
ShowExecptionMsg(ex);
}
}
}
}
catch (Exception ex)
{
ShowMsg("接收UDP数据时出错:");
ShowExecptionMsg(ex);
}
finally
{

udpserver.Close();
}

}

walkghost 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 william_chwenyu 的回复:]

引用 13 楼 walkghost 的回复:
引用 9 楼 william_chwenyu 的回复:

引用 4 楼 walkghost 的回复:
引用楼主 william_chwenyu 的回复:
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
publ……
[/Quote]
接收端:

ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
udpServer.Client.Connect(ipEndPoint);
//把上面两句改为:
ipEndPoint = new IPEndPoint(IPAddress.Any, 0);//这么写是让你的UDPClient能接收所有终端发过来的数据。
// udpServer.Client.Connect(ipEndPoint);
//另外,你Catch到异常之后不应该直接Break,应该看一下异常原因。


william_chwenyu 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 walkghost 的回复:]
引用 9 楼 william_chwenyu 的回复:

引用 4 楼 walkghost 的回复:
引用楼主 william_chwenyu 的回复:
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
Initialize……
[/Quote]

主要是悲剧了,运行的时候老是收不到数据。。。。。
walkghost 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 william_chwenyu 的回复:]

引用 4 楼 walkghost 的回复:
引用楼主 william_chwenyu 的回复:
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
InitializeComponent();
udpClie……

因为R……
[/Quote]

如果你只是接收本机的程序以127.0.0.1:8001作为发送端往你写的这个程序上发送数据的话,你的接收程序是没问题的,但是如果你想接收所有的终端发过来的数据的话,你就应当这样定义:


ipEndPoint = new IPEndPoint(IPAddress.Any, 0);//这么写是让你的UDPClient能接收所有终端发过来的数据。

uc_xkj1 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 walkghost 的回复:]
引用楼主 william_chwenyu 的回复:
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
InitializeComponent();
udpClie……

因为Receive方法是同步阻止模式下的接收数据方法,……
[/Quote]
正解,研究一天了
deepmist 2011-03-16
  • 打赏
  • 举报
回复
http://www.cnblogs.com/tuyile006/archive/2006/12/30/607823.html

这个例子你看看
zhangshuqiang123 2011-03-16
  • 打赏
  • 举报
回复
没试过你这么接收的
william_chwenyu 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 walkghost 的回复:]
引用楼主 william_chwenyu 的回复:
发送端:
public partial class Form1 : Form
{
UdpClient udpClient;
IPEndPoint ipEndPoint;
public Form1()
{
InitializeComponent();
udpClie……

因为Receive方法是同步阻止模式下的接收数据方法,……
[/Quote]

我已经开了一个线程做接收了呀,界面也一直没有卡,发送端发送数据,但是接收端一直都接收不到数据,这点比较郁闷。。。。
你说的msdn我都看了很多遍了。。。
能把你的想法说的仔细点嘛?谢了
无趣 2011-03-16
  • 打赏
  • 举报
回复
一句话,阻塞式编程,很正常。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧