gpt4 book ai didi

c# - Android客户端自动寻找C#服务器

转载 作者:行者123 更新时间:2023-12-01 13:47:02 26 4
gpt4 key购买 nike

我的 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_接收关闭
包裹已发送
UDP_发送关闭

(So... I think that servers code is OK...)

现在
android.java客户端代码:
附言。该代码在应用程序启动后自动执行。

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/已接收(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);
}

关于c# - Android客户端自动寻找C#服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com