gpt4 book ai didi

android - Android 模拟器的套接字有效但不适用于真实设备

转载 作者:行者123 更新时间:2023-11-29 00:56:28 24 4
gpt4 key购买 nike

我有通过 ip 将字符串发送到 python 脚本的 java 代码。该代码与模拟器完美配合,但当我通过 usb 成功将应用程序安装到我的手机时,它不起作用。这是代码:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {
public String message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final Button btn_python = findViewById(R.id.python);
final Button btn_movie = findViewById(R.id.movie);
final Button btn_hw = findViewById(R.id.homework);
btn_python.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view1) {
send py = new send();
message = "python";
Log.i("Button", "Button works");
System.out.println("whatever");
py.execute();
}
});
btn_movie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view2) {
send mov = new send();
message = "movie";
mov.execute();
}
});
btn_hw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view2) {
send hw = new send();
message = "homework";
hw.execute();
}
});
}
class send extends AsyncTask<Void,Void,Void>{
Socket s;
PrintWriter pw;
@Override
protected Void doInBackground(Void...params) {
System.out.println("whatevernumbertwo");
try {
System.out.println("whatevernumberthree");
s = new Socket("ip address", 7800);
Log.i("Socket", "connects to socket");
pw = new PrintWriter(s.getOutputStream());
Log.i("output stream", "Output stream works");
pw.write(message);
Log.i("write", "Write works");
pw.flush();
Log.i("flush", "Flush works");
pw.close();
s.close();
} catch (UnknownHostException e) {
System.out.println("Fail");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Fail");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}

正如我提到的,这适用于模拟器,但不适用于实际设备。还授予了适当的权限。我究竟做错了什么?提前致谢。

最佳答案

经过多方挖掘,原来是服务器的防火墙。这就解释了为什么(显然)没有抛出异常,以及为什么代码似乎没有执行;它正在执行,它只是卡在 Socket() 中(在连接期间)。

Socket() 肯定会抛出一个 IOException;可能只需要一段时间。

代码在模拟器上运行,因为它在同一台机器上运行,它在防火墙后面。

关于android - Android 模拟器的套接字有效但不适用于真实设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54450873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com