Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android TCP Listener不适用于3G/4G?_Java_Android_Sockets_Tcp_Serversocket - Fatal编程技术网

Java Android TCP Listener不适用于3G/4G?

Java Android TCP Listener不适用于3G/4G?,java,android,sockets,tcp,serversocket,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=161

我正在开发一个应用程序,我制作了一个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;
}
公共类ListenerService扩展服务{
插座;
私有服务器套接字服务器套接字;
BufferedReader in=null;
静态字符串消息=null;
int端口号=1619;
布尔标志=真;
最终静态字符串MY\u ACTION=“MY\u ACTION”;
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
新任务().execute();
}
私有类任务扩展了异步任务{
@凌驾
受保护字符串doInBackground(Void…params){
试一试{
serverSocket=新的serverSocket(端口号);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
while(旗帜){
试一试{
socket=serverSocket.accept();
in=新的BufferedReader(新的InputStreamReader(
getInputStream());
//试一试{
StringBuilder总计=新StringBuilder();
弦线;
而((line=in.readLine())!=null){
合计.追加(行);
}
message=total.toString();
Log.d(“网络接收”、“消息!:”+消息);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
试一试{
serverSocket.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回消息;
}
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
Log.d(“服务器启动”,“侦听器服务器正在运行”);
//Toast.makeText(getApplicationContext(),“服务已启动”,Toast.LENGTH_LONG.show();
返回super.onStartCommand(intent、flags、startId);
}
@凌驾
公共IBinder onBind(意向){
//TODO自动生成的方法存根
返回null;
}
}


有人能告诉我我遗漏了什么吗?

你正在尝试通过TCP连接两个设备,连接到两个不同的子网。这是不可能的。你几乎是在问这样一个问题:“为什么我的朋友站在我面前时能听到我的声音,但如果他在另一个房间时却听不到?”唯一可行的方法是打开门,但你必须实现这个“门”,它被称为NAT遍历或“打孔”,实际上是一个不同的通信概念(检查和)

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

  • 实现您自己的服务器,将它们放在您想要连接的设备之间(非常繁琐)
  • 使用第三方库或其他适合您的库
  • 别费心了。有时候这不值得费心

  • 编辑:
    听起来你有一个web服务器正在尝试连接到运行上述代码的Android设备。这可能是选项1,但仍然无法通过Internet访问Android设备。据我所知,你必须改变这一点:该设备必须在服务器上注册自身,以便服务器可以“连接”其他设备连接到它。

    这是不可能的,我将从连接到不同网络的wifi的手机上点击我的服务器。点击后,服务器将在我的端口1619发送数据。在wifi上工作正常。但当我连接到我的移动网络时,它不工作,我认为存在许可或套接字连接问题。@Muhammaddeem什么“服务器”?真正的网络服务器?在这种情况下是可能的。但是如果你的“服务器”是安卓设备,这是不可能的,因为没有Wi-Fi或其他子网无法访问它,除非路由并专门配置为web服务器。是的,我们有一个web服务器。我正在为web服务器制作侦听器。当web服务器在我的安卓手机上发送数据时,我的侦听器在端口1619上侦听数据,工作正常但如果我连接到3G或4G,它就不工作了。我遇到了类似的问题,通过将手机连接到与连接到android设备的客户端共享的VPN解决了这个问题。