Android客户端自动查找C#服务器

我的Android客户端正试图在网络中找到C#服务器…

这是程序
0.服务器正在侦听UDP数据包
1.客户端发送UDP数据包并开始侦听响应
2.服务器接收UDP数据包,如果客户端发送数据包,则服务器向客户端发送新的UDP数据包
3.客户端接收UDP数据包

C#服务器代码:

//receive UDP packet int port = (int)float.Parse(Variables.port_key); UdpClient UDP_receive = new UdpClient(port); IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); IPAddress from_addr = null; Boolean gogo = false; ExecuteCommand("Receiving..."); while (!gogo) { Byte[] receiveBytes = UDP_receive.Receive(ref RemoteIpEndPoint); string returnData = Encoding.UTF8.GetString(receiveBytes); if (returnData.ToString() == "83hcX1") { gogo = true; } from_addr = RemoteIpEndPoint.Address; ExecuteCommand("Package received: " + returnData.ToString()); } ExecuteCommand("Out of loop"); UDP_receive.Close(); ExecuteCommand("UDP_receive closed"); //send UDP packet UdpClient UDP_send = new UdpClient(); IPEndPoint ipEndPoint = new IPEndPoint(from_addr, port); Byte[] sendBytes = Encoding.UTF8.GetBytes("94dbF5"); UDP_send.Send(sendBytes, sendBytes.Length, ipEndPoint); ExecuteCommand("Package sent"); UDP_send.Close(); ExecuteCommand("UDP_send closed"); 

这是结果:
接收…
收到包裹:83hcX1
走出循环
UDP_receive已关闭
包发送
UDP_send已关闭

(所以…我认为服务器代码没问题……)

现在
android.java客户端代码:
PS。 应用程序启动后会自动执行此代码。

 int port = SERVERPORT; //send UDP packet DatagramSocket UDP_send = new DatagramSocket(); byte[] b = "83hcX1".getBytes("UTF-8"); DatagramPacket outgoing = new DatagramPacket(b, b.length, getBroadcastAddress(Main.this), port); UDP_send.send(outgoing); Log.e("UDP", "Package sent"); UDP_send.close(); Log.e("UDP", "UDP_send closed"); //receive UDP packet DatagramSocket UDP_receive = new DatagramSocket(port); boolean gogo = false; Log.e("UDP", "Receiving..."); while (!gogo) { byte[] buffer = new byte[1000]; DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); UDP_receive.receive(incoming); String message = new String(incoming.getData(), 0, incoming.getLength(), "UTF-8"); Log.e("Received", incoming.getPort() + "" + incoming.getAddress() + message); if (message.equals("94dbF5")) { Log.e("UDP", "Same"); gogo = true; }else { Log.e("UDP", "Not same!"); } } Log.e("UDP", "I'm out of loop"); UDP_receive.close(); Log.e("UDP", "UDP_receive closed"); 

结果:
第一次开始后:
07-10 22:35:04.017:E / UDP(4638):发送包
07-10 22:35:04.027:E / UDP(4638):UDP_send关闭
07-10 22:35:04.047:E / UDP(4638):接收……

如果我重新启动app,我会得到这个:
07-10 22:45:05.327:E / Received(4638):42283 / 192.168.3.1883hcX1
07-10 22:45:05.327:E / UDP(4638):发送包
07-10 22:45:05.327:E / UDP(4638):UDP_send已关闭
07-10 22:45:05.347:E / UDP(4638):不一样!
07-10 22:45:05.347:E / UDP(4638):java.net.BindException:地址已在使用中

如果我重新启动应用和服务器:
07-10 22:47:36.447:E / Received(4638):57895 / 192.168.3.1883hcX1
07-10 22:47:36.467:E / UDP(4638):不一样!
07-10 22:47:36.477:E / UDP(4638):发送包
07-10 22:47:36.477:E / UDP(4638):UDP_send已关闭
07-10 22:47:36.487:E / Received(4638): 61420 / 192.168.3.1094dbF5
07-10 22:47:36.497:E / UDP(4638):java.net.BindException:地址已在使用中
07-10 22:47:36.507:E / UDP(4638):相同
07-10 22:47:36.507:E / UDP(4638):我已经失控了
07-10 22:47:36.527:E / UDP(4638):UDP_receive已关闭

我知道我在做与端口有关的错误(因为我得到java.net.BindException:地址已经在使用 – 错误),但是什么? 为什么我只在第二次启动应用程序和服务器后才能得到我想要的结果( 61420 / 192.168.3.1094dbF5 )?

解决了!
这是一个有效的例子:

C#服务器

  //receive UDP packet int port = (int)float.Parse(Variables.port_key); UdpCient UDP_packet = new UdpClient(port); UDP_packet.EnableBroadcast = true; IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); IPAddress from_addr = null; Boolean gogo = false; while (!gogo) { Byte[] receiveBytes = UDP_packet.Receive(ref RemoteIpEndPoint); string returnData = Encoding.UTF8.GetString(receiveBytes); if (returnData.ToString() == "83hcX1") { gogo = true; } from_addr = RemoteIpEndPoint.Address; } //send UDP packet IPEndPoint ipEndPoint = new IPEndPoint(from_addr, port); Byte[] sendBytes = Encoding.UTF8.GetBytes("94dbF5"); UDP_packet.Send(sendBytes, sendBytes.Length, ipEndPoint); UDP_packet.Close(); 

Android客户端

  //send UDP packet DatagramSocket UDP_packet = new DatagramSocket(SERVERPORT); UDP_packet.setBroadcast(true); byte[] b = "83hcX1".getBytes("UTF-8"); DatagramPacket outgoing = new DatagramPacket(b, b.length, getBroadcastAddress(Main.this), SERVERPORT); UDP_packet.send(outgoing); //receive UDP packet boolean gogo = false; while (!gogo) { byte[] buffer = new byte[1024]; DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); UDP_packet.receive(incoming); String message = new String(incoming.getData(), 0, incoming.getLength(), "UTF-8"); if (message.equals("94dbF5")) { gogo = true; SERVER_IP = incoming.getAddress(); } } UDP_packet.close(); 

现在您可以连接到服务器地址(SERVER_IP)。
此外,我读到一些路由器(可能是5%)阻止UDP广播,所以…小心。

如果有人看到任何错误,请发布。

编辑:

 InetAddress getBroadcastAddress(Context context) throws IOException { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); DhcpInfo dhcp = wifi.getDhcpInfo(); if (dhcp == null) { return null; } int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; byte[] quads = new byte[4]; for (int k = 0; k < 4; k++) quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); return InetAddress.getByAddress(quads); }