【问题标题】:Android client finding C# server automaticallyAndroid客户端自动查找C#服务器
【发布时间】:2013-12-15 22:46:55
【问题描述】:

我的 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): 接收...

如果我重新启动应用程序,我会得到:
07-10 22:45:05.327: E/收到(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/收到(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: Address already in use - 错误),但是什么? 为什么只有在应用和服务器第二次启动后才能得到我想要的结果(61420/192.168.3.1094dbF5)?

【问题讨论】:

  • 我认为你的意思是 UDP 数据包
  • 是的,对不起我的英语不好。

标签: c# java android sockets networking


【解决方案1】:

解决了!
这是一个工作示例:

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);
    }

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 2015-03-10
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2018-06-14
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多