Android 服务器多次尝试接收数据包
这已经困扰了我一段时间,我不太确定如何着手解决这个问题 我遇到的问题是,在服务器实际接收数据包之前,需要多次尝试推送数据包 这是我在客户机上的代码(服务器是相同的,但发送/接收是相反的),服务器从数据包获取客户机IP以发送返回数据包Android 服务器多次尝试接收数据包,android,google-tv,Android,Google Tv,这已经困扰了我一段时间,我不太确定如何着手解决这个问题 我遇到的问题是,在服务器实际接收数据包之前,需要多次尝试推送数据包 这是我在客户机上的代码(服务器是相同的,但发送/接收是相反的),服务器从数据包获取客户机IP以发送返回数据包 class MainTask extends AsyncTask<Void, Void, Void> { ProgressDialog progress = null; Context context = null; public MainTask(
class MainTask extends AsyncTask<Void, Void, Void> {
ProgressDialog progress = null;
Context context = null;
public MainTask(ProgressDialog progress, Context context) {
this.progress = progress;
this.context = context;
}
public void onPreExecute() {
progress.show();
}
public Void doInBackground(Void... unused) {
// Send UDP Packet
String messageStr="Hello Android!";
int server_port = 12441;
DatagramSocket s = null;
DatagramPacket p = null;
InetAddress local = null;
Log.i("EyeceBoxService", "Sending packet");
try {
s = new DatagramSocket();
local = InetAddress.getByName("192.168.0.4");
int msg_length=messageStr.length();
byte[] message = messageStr.getBytes();
p = new DatagramPacket(message, msg_length,local,server_port);
s.send(p);
Log.i("EyeceBoxService", "Packet Sent!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Receive UDP Packet
byte[] message = new byte[1500];
try {
//progress.setMessage("Retrieving Discovery Information...");
p = new DatagramPacket(message, message.length);
s = new DatagramSocket(server_port);
Log.i("EyeceBoxService", "Waiting for packet");
s.receive(p);
String address = p.getAddress().toString();
Log.i("EyeceBoxService", "Server IP address" + address);
//progress.setMessage("Done...");
//MainActivity.buildNotification(context, address);
progress.dismiss();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void onPostExecute(Void unused) {
}
}
class MainTask扩展了AsyncTask{
ProgressDialog progress=null;
Context=null;
公共主任务(进度对话框进度、上下文){
这个。进步=进步;
this.context=上下文;
}
public void onPreExecute(){
progress.show();
}
公共作废doInBackground(作废…未使用){
//发送UDP数据包
String messageStr=“你好,安卓!”;
int服务器_端口=12441;
DatagramSocket s=null;
DatagramPacket p=null;
InetAddress local=null;
Log.i(“EyeceBoxService”,“发送数据包”);
试一试{
s=新的DatagramSocket();
local=InetAddress.getByName(“192.168.0.4”);
int msg_length=messageStr.length();
byte[]message=messageStr.getBytes();
p=新数据包(消息、消息长度、本地、服务器端口);
s、 发送(p);
Log.i(“EyeceBoxService”,“数据包已发送!”);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//接收UDP数据包
字节[]消息=新字节[1500];
试一试{
//progress.setMessage(“检索发现信息…”);
p=新的数据包(message,message.length);
s=新的DatagramSocket(服务器\端口);
Log.i(“EyeceBoxService”,“等待数据包”);
s、 接收(p);
字符串地址=p.getAddress().toString();
Log.i(“EyeceBoxService”,“服务器IP地址”+地址);
//progress.setMessage(“完成…”);
//MainActivity.buildNotification(上下文、地址);
进步。解散();
s、 close();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
公共void onPostExecute(void unused){
}
}
尝试找出问题是在服务器硬件、客户端硬件、Android框架、网络、路由器配置还是您的代码中。尝试使用一些调试工具,如wireshark、netcat、ipsend,看看实际发送和接收的数据包是什么,数据包发送是否通过命令行工作等等。简单想想——尝试将接收放在发送前启动的单独线程上。很可能你已经发送了你的消息,并且它在你的接收器安装好之前就回来了。这是可能的。是的,我会尝试一下,我看到的唯一问题是它会等到它在自己的线程上收到一些应该是正常的东西。