C# UDP通信中,一个服务器端,对应多个客户端问题

hujianreplace 2013-06-19 02:50:34
最近工作需要,需要用到UDP通,在网上找了点资料看了下。然后开始做。
做的是一个服务器端对应多个客户端。
在服务器端建立一个监听线程,监听某个端口,所有客户端都向这个端口发数据,情况分两种
第一种情况,服务器收到数据后,只显示出收到的消息 ,而不与任何一个客户端进行交互,这时候,各个客户端都能与服务器正常连接,发送数据也成功。服务器也能显示出客户端发送的消息 。
第二种情况,如果服务器与某个客户端(假如叫aclient)进行通信,那么其它客户端就不能再与服务器通信了, 只有aclient向服务器发送消息的时候,服务器才能显示aclient发送的消息 ,别的客户端发送消息 ,在服务器那没有任何响应
...全文
798 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ld2611 2014-03-25
  • 打赏
  • 举报
回复
hujianreplace 2013-06-20
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
[quote=引用 楼主 hujianreplace 的回复:] 最近工作需要,需要用到UDP通,在网上找了点资料看了下。然后开始做。 做的是一个服务器端对应多个客户端。 在服务器端建立一个监听线程,监听某个端口,所有客户端都向这个端口发数据,情况分两种 第一种情况,服务器收到数据后,只显示出收到的消息 ,而不与任何一个客户端进行交互,这时候,各个客户端都能与服务器正常连接,发送数据也成功。服务器也能显示出客户端发送的消息 。 第二种情况,如果服务器与某个客户端(假如叫aclient)进行通信,那么其它客户端就不能再与服务器通信了, 只有aclient向服务器发送消息的时候,服务器才能显示aclient发送的消息 ,别的客户端发送消息 ,在服务器那没有任何响应
如果是UDB就没有服务端与客户端的区别,可以说全是客户端。还有UDP不需要accep 那是TCP的东西,不要混为一谈。 第二种情况很奇葩。是你想实现这个情况,还是你所写的代码变成了这情况??[/quote] 我想实现的是,多个客户端都能与服务端,进行收发信息。我现在写的代码变成了这种情况。
hujianreplace 2013-06-20
  • 打赏
  • 举报
回复
引用 4 楼 xiaozhi_5638 的回复:
UDP.BeginReceive(...,OnReceive,...); //异步操作 上网查找“APM” 异步编程模型 OnReceive() { //处理接收进来的数据 // this.BeginInvoke(...) //异步操作 UDP.BeginReceive(..,OnReceive,...); }
我用异步传输确实解决了这个问题,还可以转发某个客户端发过来的消息,给其它客户端,但是,同步阻塞模式出问题,原因是什么呢? 原理不懂啊, 只是找了个例子,知道这样用,知其然,不知其所以然。
  • 打赏
  • 举报
回复
您能不能把那些注释掉的代码删除? 带着一堆垃圾(已经注释掉的代码),貌似你写了很多代码似地。实际上这会干扰一个阅读者的判断能力。删除了那些注释掉的根本不执行代码,这程序还剩什么代码?
本拉灯 2013-06-20
  • 打赏
  • 举报
回复
引用 8 楼 hujianreplace 的回复:
[quote=引用 6 楼 wyd1520 的回复:] [quote=引用 楼主 hujianreplace 的回复:] 最近工作需要,需要用到UDP通,在网上找了点资料看了下。然后开始做。 做的是一个服务器端对应多个客户端。 在服务器端建立一个监听线程,监听某个端口,所有客户端都向这个端口发数据,情况分两种 第一种情况,服务器收到数据后,只显示出收到的消息 ,而不与任何一个客户端进行交互,这时候,各个客户端都能与服务器正常连接,发送数据也成功。服务器也能显示出客户端发送的消息 。 第二种情况,如果服务器与某个客户端(假如叫aclient)进行通信,那么其它客户端就不能再与服务器通信了, 只有aclient向服务器发送消息的时候,服务器才能显示aclient发送的消息 ,别的客户端发送消息 ,在服务器那没有任何响应
如果是UDB就没有服务端与客户端的区别,可以说全是客户端。还有UDP不需要accep 那是TCP的东西,不要混为一谈。 第二种情况很奇葩。是你想实现这个情况,还是你所写的代码变成了这情况??[/quote] 我想实现的是,多个客户端都能与服务端,进行收发信息。我现在写的代码变成了这种情况。[/quote] 那就是UDP服务没写对。UDP客户端之间 内网是不需要通过服务端收发。只要在外网情况下,需要请求服务端 打洞(NAT).
本拉灯 2013-06-19
  • 打赏
  • 举报
回复
引用 楼主 hujianreplace 的回复:
最近工作需要,需要用到UDP通,在网上找了点资料看了下。然后开始做。 做的是一个服务器端对应多个客户端。 在服务器端建立一个监听线程,监听某个端口,所有客户端都向这个端口发数据,情况分两种 第一种情况,服务器收到数据后,只显示出收到的消息 ,而不与任何一个客户端进行交互,这时候,各个客户端都能与服务器正常连接,发送数据也成功。服务器也能显示出客户端发送的消息 。 第二种情况,如果服务器与某个客户端(假如叫aclient)进行通信,那么其它客户端就不能再与服务器通信了, 只有aclient向服务器发送消息的时候,服务器才能显示aclient发送的消息 ,别的客户端发送消息 ,在服务器那没有任何响应
如果是UDB就没有服务端与客户端的区别,可以说全是客户端。还有UDP不需要accep 那是TCP的东西,不要混为一谈。 第二种情况很奇葩。是你想实现这个情况,还是你所写的代码变成了这情况??
Ace-cool-lin 2013-06-19
  • 打赏
  • 举报
回复
UDP是不需要连接的,就像发手机短信那样的,TCP应该才是你想要的,你说的应该是同步通信!
请叫我卷福 2013-06-19
  • 打赏
  • 举报
回复
UDP.BeginReceive(...,OnReceive,...); //异步操作 上网查找“APM” 异步编程模型 OnReceive() { //处理接收进来的数据 // this.BeginInvoke(...) //异步操作 UDP.BeginReceive(..,OnReceive,...); }
hujianreplace 2013-06-19
  • 打赏
  • 举报
回复
//监听线程 private void ShowMessage() { Dictionary<Mix_HostCommand_Receive, string> messageFromMixHost; Dictionary<Mix_HostCommand_Send, string> messageFromAppPhone; while (true) { string rtnData = ""; rtnData = this.udpListenerThred.GetMixHostMessage(); this.Invoke((EventHandler)delegate { if (rtnData != "") { //MessageBox.Show("来自客户端的消息" + rtnData, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); if (this.mixIpEnd.IpPort == this.serverPort) { //messageFromMixHost = MixHostCommand.ResolveReceiveCommand(rtnData); //GetRealCommond(messageFromMixHost); //SendCommandToSerialComPort(); //if (chkLoopItem.Checked) //循环播放 //{ // if (messageFromMixHost.ContainsKey(Mix_HostCommand_Receive.EOF)) //文件播放完毕后,重新播放 // { // this.udpListenerThred.Replay(); // } //} MessageBox.Show("来自服务器端的消息" + rtnData, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { //messageFromAppPhone = MixHostCommand.ResolveSendCommand(rtnData); //GetRealCommond(messageFromAppPhone); MessageBox.Show("来自客户端的消息" + rtnData, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } }); } } 监听代码是这样的
请叫我卷福 2013-06-19
  • 打赏
  • 举报
回复
分清TCP和UDP的区别 udp一般不需要accept 检查服务器与aclient通信的时候是否出错了
wzqwww 2013-06-19
  • 打赏
  • 举报
回复
你的accept有没有while(true)

110,500

社区成员

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

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

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