关于 Socket UDP 问题(公网上UDP通讯)^^^^^^^(100分)
服务端如何像客户端发送消息(使用Socket UDP )????
服务端是接收的到客户端的消息,但是服务端如何回应客户端呢?
//看看我的代码(服务端)
public void sk()//这里是一个线程的执行过程
{
while(true)
{
s= new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
//主要在这里,由于这里是服务端(知道固定的IP,和发往固定的端口
EndPoint localEp=new IPEndPoint(IPAddress.Any,11200);
//所以这里的bind很顺利,因为客户端发过来的端口是11200
s.Bind(localEp);
EndPoint senderRemote = (EndPoint)sender;
byte[] msg = new byte[2500];
//使用ReceiveFrom必须先使用s.Bind
s.ReceiveFrom(msg,SocketFlags.None, ref senderRemote);
//下面是服务端一个组件(textBox)接收数据
textBox2.Text+=System.Text.UTF8Encoding.UTF8.GetString(msg)+"\r\n";
//获得了客户端的IP和发送端口(当然这里的客户端端口不会是一个固定的值)
IPEndPoint sender2=(IPEndPoint)senderRemote;
textBox2.Text+=sender2.Address.ToString()+"\r\n";
textBox2.Text+=sender2.Port.ToString()+"\r\n";
textBox2.Text+="____________________________________\r\n";
//在这里服务端收到消息后立即回复客户端口
byte[] ByteGet=new byte[2500];
ByteGet=System.Text.UTF8Encoding.UTF8.GetBytes("服务器已经接收到!!!!!!!!!!!!");
//这里回复给客户端(由于恢复的客户端端口不确定,但是我们可以从senderRemote这里知道)
s.SendTo(ByteGet,SocketFlags.None,senderRemote);
//最后结束
s.Close();
}
}
//=========================================================================
客户端代码
public void sk()//发送过程,不在线程里,使用一个按钮事件调用
{
s= new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
byte[] ByteGet=new byte[2500];
ByteGet=System.Text.UTF8Encoding.UTF8.GetBytes("发送了数据");
IPAddress a = IPAddress.Parse("219.137.203.209");
receivePoint = new IPEndPoint (a,11200);
EndPoint senderRemote = (EndPoint)receivePoint;
//发送给服务端,因为服务端是固定的IP和端口11200
//如果这里发送的端口不是11200,那么服务端接收不到
//因为在服务端代码里面已经s.Bind(localEp);到了11200
s.SendTo(ByteGet,SocketFlags.None,senderRemote);
s.Close();
//结果服务端可以正常接收,多太客户端同时发送,服务端也可以接收
}
客户端接收服务端代码
public void cs()//一个线程的过程
{
while ( true )
{
s1= new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//设置超过
s1.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout,
3000
);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
//问题就在这里,到底客户端该如何Bind,跪求请高高高高手
EndPoint localEp=new IPEndPoint(IPAddress.Any,11003);
s1.Bind(localEp);
EndPoint senderRemote = (EndPoint)sender;
byte[] msg = new byte[2500];
int i=0;
try
{
//这里怎么样都无法得到服务器返回的消息
//我估计原因就在s1.Bind(localEp);但是localEp该如何设置呢?
//服务器每次返回端口的都不一样
s1.ReceiveFrom(msg,SocketFlags.None, ref senderRemote);
textBox4.Text+=System.Text.UTF8Encoding.UTF8.GetString(msg)+"\r\n";
}
catch(SocketException e)
{
textBox5.Text=e.Message;
}
s1.Close();
}
}
//============================================================================
哎^^^^^^就是这个问题,我查看了大量的文章和大量的论坛,都没有找到答案!!!
也就是服务端如何像客户端发送消息(使用Socket UDP )????
跪求各位大侠^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^