UDP 多线程发送消息求助

问题描述

求助各位大神,想用UDP与多台客户端通信,下面的代码如果光接收,正常可以用,加入发送后,就会有阻塞,哪位好人指点一下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Collections;usingSystem.Threading;namespaceudpServer0929{classProgram{staticvoidMain(string[]args){Programa=newProgram();a.BeginStart();Threadb=newThread(a.Send);b.Start();}publicvoidBeginStart(){ArrayListclient=newArrayList();try{Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointip=newIPEndPoint(IPAddress.Any,8001);newsock.Bind(ip);Threadth=newThread(Recive);th.Start(newsock);Console.WriteLine("服务端开启监听");Console.ReadKey();}catch(Exceptionex){}}Dictionary<EndPoint,Socket>dicSocket=newDictionary<EndPoint,Socket>();voidRecive(objecto){Socketnewsock=oasSocket;IPEndPointsender=newIPEndPoint(IPAddress.Any,0);EndPointRemote=(EndPoint)sender;intrecv;while(true){try{byte[]buffer=newbyte[1024*1024*2];recv=newsock.ReceiveFrom(buffer,refRemote);Console.WriteLine("Messagereceivedfrom{0}:",Remote);Console.WriteLine(Encoding.ASCII.GetString(buffer,0,recv));//newsock.SendTo(buffer,buffer.Length,SocketFlags.None,refRemote);dicSocket.Add(Remote,newsock);}catch(Exceptionex){}}}

解决方案

解决方案二:
你所用的都是用阻塞的方法你改用m_Socket.BeginReceiveFrom()接收m_Socket.BeginSendTo()发送,就不会阻塞了当然你的程序要改一下,不能用while(true)来整。像这样子///<summary>///开始从指定网络设备中异步接收数据。///</summary>privatevoidBeginReceive(){ReceiveDatabufferData=newReceiveData();//使用对象池//kickoffanasyncreadm_Socket.BeginReceiveFrom(bufferData.Data,0,bufferData.Data.Length,SocketFlags.None,refbufferData.RemoteEndPoint,m_OnReceive,bufferData);}///<summary>///接收异步数据///</summary>///<paramname="asyncResult"></param>privatevoidOnReceive(IAsyncResultasyncResult){ReceiveDatabuffer=(ReceiveData)asyncResult.AsyncState;try{intlength=m_Socket.EndReceiveFrom(asyncResult,refbuffer.RemoteEndPoint);if(length>0){byte[]buferData=newbyte[length];System.Buffer.BlockCopy(buffer.Data,0,buferData,0,length);BeginReceive();return;}}catch{m_Running=false;}}
解决方案三:
是的,可以试试.net4.5的非阻塞调用
解决方案四:
非常感谢各位大侠

时间: 2024-10-30 21:18:54

UDP 多线程发送消息求助的相关文章

关于socket通信,多线程发送消息

问题描述 关于socket通信,多线程发送消息 最近在多线程中使用socket通信遇到的问题,场景是有多个线程需要用到同一个socket连接进行消息的发送,因为没有订具体的协议,所以对于发送(文本)消息,每次发送端发送1K字节,接收端每次接收1K字节,无效数据用0填充,正常情况下来说都没什么问题,但当接收方接收不过来时,由于发送方设置了发送超时(30ms),send会发出EWOULDBLOCK,这下问题来了,推消息设计时设置超时就是希望对方不收就扔掉, 那么如果收到EWOULDBLOCK 就返回

atagram ocket-java udp DatagramSocket 发送接收消息

问题描述 java udp DatagramSocket 发送接收消息 使用如下代码发送并接收消息: SocketClient client = new SocketClient(); String serverHost = ""127.0.0.1""; int serverPort = 3333; client.send(serverHost serverPort (""你好,阿蜜果!"").getBytes()); Str

udp-QQ通讯使用UDP, 那它怎么实现发送消息失败提醒的

问题描述 QQ通讯使用UDP, 那它怎么实现发送消息失败提醒的 既然是点对点的通信,就不用经过腾讯服务器啊,那它怎么检测到的? 还有,我的qq怎么知道对方qq的IP和应用端口号的? 求解啊!有没有大神指导指导. 解决方案 它的检测正确度并不高,我估计是检测网络连接通不通吧. 好比你在cmd命令下ping一下,网络不通的话估计默认qq消息没有发出去了.而且报告没有发出去的时间是有延时的. 但有时虽然说没有发出去,对方也收到了. 我猜,它失败提醒和发送消息是两个不通的进程. 解决方案二: UDP用户

Socket编程 (连接,发送消息) (Tcp、Udp) - Part1

原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html Socket编程 (连接,发送消息) (Tcp.Udp)  本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式.(服务器端与客户端的通讯) 1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息. 使用Tcp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) (2).绑定服

求助 :发送消息缓冲区时发生输入输出错误

问题描述 我只是个实习生;很多东西都不懂;请大家解释的详细点谢谢做MQ的压力测试的时候;写了一个读string数组写入MQ的方法;结果出现如下错误MQJE001:发生MQException:完成码2,原因2009MQJE003:发送消息缓冲区时发生输入输出错误MQJE001:完成码2,原因2009com.ibm.mq.MQException:MQJE001:完成码2,原因2009atcom.ibm.mq.MQQueue.put(MQQueue.java:1207)atcom.ibm.mq.MQQ

UDP多线程传输,为什么客户端向服务器发送数据,能收到;服务器向客户端发数据却不能收到?

问题描述 //客户端#include"stdafx.h"#include<winsock2.h>#include<iostream>#include<cstdlib>#pragmacomment(lib,"WS2_32")//链接到WS2_32.lib#defineBUFFERLEN256usingnamespacestd;classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmaj

udpclient 通讯-C # UDPClient 通讯连续发送消息

问题描述 C # UDPClient 通讯连续发送消息 如何实现UDP通讯时的连续发送消息,目前我只实现发送一条消息就不能再发送,在网上搜找后说要使用多线程,但是我不会啊,请求高手指导> Server: private void btRec_Click(object sender, EventArgs e) { //在本機指定的端口接收 IPEndPoint remoteIpEndIPoint = new IPEndPoint(IPAddress.Any, 8002); udpReceive =

TCP和UDP的&quot;保护消息边界&quot; (经典)

在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制.       对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,所以接收端的skbu

同个局域网的两台计算机,win7系统已无信使服务,server2003如何向win7发送消息?

问题描述 同个局域网的两台计算机,win7系统已无信使服务,server2003如何向win7发送消息? 以前server和xp系统之间可以通过信使服务相互发送消息,可从vista后就取消了信使服务,那如何实现同一局域网内server2003和win7之间的消息发送呢? 解决方案 win7系统局域网中隐藏本地计算机 解决方案二: 只能用socket等程序了.或者tcp,udp等客户端,没有系统自带的服务