我对Android中的Socket Communication毫无疑问。
1)我已经开发了用于侦听端口8888的android服务器套接字应用程序。
a)当我将服务器托管在模拟器上时,由于两个(模拟器和客户端)应用程序都在笔记本电脑和同一网络上,因此我无法通过PC上的客户端应用程序与服务器进行通信能够互相交流。
b)当我在android移动设备上部署相同的服务器应用程序并尝试通过与PC上相同的客户端应用程序进行通信时,客户端应用程序会出现超时异常,因为它无法与之通信。
我的第一个问题是如何使用Emulator和1个android设备测试服务器/客户端套接字应用程序?我什至可以使用PC的客户端套接字应用程序来测试服务器套接字吗?
**我的其他应用程序都有客户端套接字应用程序,因此客户端应用程序没有问题。
2)我的第二个问题是要在android设备上测试我的服务器应用程序,我是否必须转发所需的端口?a)对于仿真器:如何转发端口?b)对于设备:如何转发端口?c)我可以以编程方式转发端口吗?
**仅供参考:
我正在使用Eclipse作为android开发工具。
**我的服务器代码,因为我的服务器套接字代码也可能有问题。
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(SERVERPORT);
System.out.println("Listening :" + SERVERPORT);
System.out.println("Server IP:" + SERVERIP);
}
catch (Exception e)
{
e.printStackTrace();
}
while(true)
{
try
{
socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("ip: " + socket.getInetAddress());
String str = in.readLine();
System.out.println("message Received: " + str);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if( socket!= null)
{
try
{
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if( dataInputStream!= null)
{
try
{
dataInputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if( dataOutputStream!= null)
{
try
{
dataOutputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
编辑: 一个非常有趣的部分是,如果我将端口设置为8080 PC的Client Socket App,则确实要连接到我的android设备上的Android App,但是我没有收到服务器上的套接字,也没有收到我发送的数据。链接=>套接字= serversocket.accept();之后什么也没有发生。
另外,我在清单中设置了权限。
关于第一个问题,关于如何从仿真器访问网络:仿真器在与PC隔离的自己的网络地址空间上运行。你必须配置网络重定向才能访问网络上的设备。
在https://developer.android.com/studio/run/emulator-networking.html中查看更多详细信息
好了,对我有用,现在剩下的唯一问题是如何在我的android设备上运行同一台服务器?
不确定我是否遵循了这个问题。您的意思是上面的方案1b吗?如果是这样,假设PC正在尝试通过暴露在网络中的端口(配置为转发的端口)进行连接,它应该可以正常工作。
是的,唯一未解决的问题是关于android设备的问题。当我转发模拟器上的端口时,它可以与PC的Socket设备通信,但是我确实知道如何使PC的客户端应用程序与部署在android设备上的Android应用程序通信。
确保您正在使用客户端应用程序上的重定向端口。除此之外,没有什么大秘密了。您还可以尝试另外两种方法:1)完全在PC上测试客户端/服务器应用程序(在PC上运行Java代码-在Android上不运行),以确保它不是与Android无关的编码问题,以及2)运行Wireshark( google和下载)以查看确切的连接失败位置(例如,客户端应用程序发送了TCP SYN,但没有收到ACK或什至没有来自应用程序的SYN)。
@Seth:修复了指向新页面的链接。谢谢你让我知道。我了解链接带来的风险。但是,围绕它们的说明和细微差别并不那么简单。我必须在这里复制整个页面以使其有用。在这种情况下,链接将必须执行。