【发布时间】: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