我正在开发一个应用程序,我已经制作了一个TCP Listner,它在wifi网络上工作正常但是当我连接到3G / 4G或移动网络时它不起作用。可以在这里帮我一些吗? 我的代码在这里
public class ListenerService extends Service {
Socket socket;
private ServerSocket serverSocket;
BufferedReader in = null;
static String message=null;
int portNo=1619;
boolean flag=true;
final static String MY_ACTION = "MY_ACTION";
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
new Task().execute();
}
private class Task extends AsyncTask <Void, String, String> {
@Override
protected String doInBackground(Void... params) {
try {
serverSocket = new ServerSocket(portNo);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (flag) {
try {
socket = serverSocket.accept();
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
//try {
StringBuilder total = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
total.append(line);
}
message = total.toString();
Log.d("NETWORK-RECEIVE", "Message!:" + message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return message;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.d("Server Startd","Listener Serverice is running");
//Toast.makeText(getApplicationContext(),"Service Started", Toast.LENGTH_LONG).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
有人可以告诉我,我在这里缺少什么吗?
答案 0 :(得分:2)
您正尝试通过连接到两个不同子网的TCP连接两台设备。这不可能。你几乎都在问这个问题:“为什么我的朋友在他站在我面前时会听到我的声音,但如果他在另一个房间却不能听到我的声音?”做这项工作的唯一方法就是打开门。但你必须实现这个“门”,称为NAT遍历或“打孔”,实际上是一个不同的通信概念(检查Android P2P (direct-connection) over the Internet (behind NAT)和Android: NAT Traversal?)。
最后,您的问题有三种解决方案:
编辑:
听起来您的网络服务器正在尝试连接到运行上述代码的Android设备。这将是选项1,但仍然无法通过互联网访问Android设备。据我所知,你必须扭转局面:设备必须在服务器上注册,以便服务器可以将其他设备“连接”到它。