[英]Android App can't connect with Java Server via Socket
我正在尝试创建一个简单的测试应用程序,该应用程序通过Socket连接到我的计算机(在localhost中),但是它引发了一些异常,我不知道如何解决它。 注意:我正在手机中(而不是在模拟器中)运行apk
Java服务器代码
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Thread t = new Thread(){
@Override
public void run(){
System.out.println("Server is running and listening ... ");
try{
ServerSocket ss = new ServerSocket(7000);
while(true){
Socket s = ss.accept();
System.out.println("Connesso");
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println("Received from Client: "+ dis.readUTF());
dis.close();
s.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
};
t.start();
}
}
这是Andorid客户代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button sendBTN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBTN=(Button)findViewById(R.id.button);
sendBTN.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Thread t = new Thread(){
@Override
public void run(){
try {
System.out.println("Starting Connection");
Socket s = new Socket("127.0.0.1", 7000);
System.out.println("Connection DONE");
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("Let's Test The Socket");
dos.flush();
dos.close();
s.close();
System.out.println("Closing socket");
} catch (UnknownHostException e){
System.out.println("There was an Unknown Erorr:");
e.printStackTrace();
} catch (IOException e) {
System.out.println("There was an IOException:");
e.printStackTrace();
}
}
};
t.start();
Toast.makeText(this, "Messagge Sent...", Toast.LENGTH_SHORT).show();
}
}
我还尝试了其他一些端口,例如1432或8000或8080,但结果是相同的。然后,我尝试将IP从127.0.0.1更改为我自己的PC ip ..,我得到的是此错误。
编辑:我试图在使用10.0.2.2作为IP的模拟器中运行该应用程序,并且一切正常。.我也尝试在另一个JAVA客户端程序中使用我的Private Ip,它工作正常。.因此,问题只是连接之间我的真实电话和PC(即使它们在同一网络中)
当设置为从仿真器使用本地计算机时,请确保IP为10.0.2.2
当您使用手机和PC时:
如果您在同一网络上,请确保您为网络上的PC使用适当的IP作为服务器连接主机。 我通常将物理机(通过路由器)设置为网络上的静态IP,因此不必经常查看它们是什么,但这绝不是必需的。
如果您的电话不在家庭网络中使用,则必须使用ISP提供的IP进行连接,并且如果设置了该端口,请确保在路由器中正确转发了该端口。
无论哪种情况,都需要确保防火墙允许您指定的端口上的传入连接。
好的,我找到了解决方案。
然后,我删除了防火墙在端口7000中创建的例外,并创建了一个新的例外,该例外允许使用端口3000进行连接,现在它可以正常工作。
如果您尝试通过Android虚拟设备连接本地监听服务器,则必须首先检查AVD中的“移动数据”是否处于“开启”状态,因为如果处于“关闭”状态则无法使用,嗯,我不知道确切的原因,但它确实如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.