Java Android TCP Listener不适用于3G/4G?
我正在开发一个应用程序,我制作了一个TCP Listner,它在wifi网络上运行良好,但当我连接到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
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解决了这个问题。