Android TCP Listener无法使用3G / 4G?

时间:2014-09-22 09:13:24

标签: java android sockets tcp serversocket

我正在开发一个应用程序,我已经制作了一个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;
}

}

有人可以告诉我,我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:2)

您正尝试通过连接到两个不同子网的TCP连接两台设备。这不可能。你几乎都在问这个问题:“为什么我的朋友在他站在我面前时会听到我的声音,但如果他在另一个房间却不能听到我的声音?”做这项工作的唯一方法就是打开门。但你必须实现这个“门”,称为NAT遍历或“打孔”,实际上是一个不同的通信概念(检查Android P2P (direct-connection) over the Internet (behind NAT)Android: NAT Traversal?)。

最后,您的问题有三种解决方案:

  1. 实现您自己的服务器以放置在您想要连接的设备之间(非常繁琐)。
  2. 使用sip2peer之类的第三方库或其他适合您的其他库。
  3. 不要打扰。有时它不值得麻烦。
  4. 编辑:
    听起来您的网络服务器正在尝试连接到运行上述代码的Android设备。这将是选项1,但仍然无法通过互联网访问Android设备。据我所知,你必须扭转局面:设备必须在服务器上注册,以便服务器可以将其他设备“连接”到它。