Java Android:无法创建套接字

Java Android:无法创建套接字,java,android,sockets,networking,libgdx,Java,Android,Sockets,Networking,Libgdx,我在android中创建套接字时遇到问题。我正在使用LibGDX @Override public void create() { System.out.println("Enter IP adress."); ip = "78.61.65.198"; System.out.println("Connecting..."); socket = connection(PORT, ip); System.out.println("S

我在android中创建套接字时遇到问题。我正在使用LibGDX

            @Override
public void create() {
    System.out.println("Enter IP adress.");
    ip = "78.61.65.198";

    System.out.println("Connecting...");
    socket = connection(PORT, ip);

    System.out.println("Setting up InputStream");
    reader = reader(socket);

    System.out.println("Setting up OutputStream");
    output = output(socket);

    while (socket.isConnected()) {
        output.println("0;" + Gdx.input.getAccelerometerX() + ";" + Gdx.input.getAccelerometerY());
    }

}

public static Socket connection(int port, String ip) {
    try {
        return new Socket(InetAddress.getByName(ip), port);
    } catch (UnknownHostException e) {
        e.printStackTrace();
        System.out.println("Unknown host...");
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Failed to connect...");
        return null;
    }
}

public static BufferedReader reader(Socket socket) {

    try {
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (IOException e) {
        System.err.println("Couldn't get inputStream...");
        e.printStackTrace();
        return null;
    }
}

public static PrintStream output(Socket socket) {
    try {
        return new PrintStream(socket.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Couldn't get outputStream");
        return null;
    }
}
服务器:

    @Override
public void create() {

    System.out.println("Creating server...");
    server = hostServer(PORT);

    System.out.println("Waiting for Client 1...");
    client1 = waitForConnections(server);

    System.out.println("Setting up input/output for client 1...");
    client1Input = reader(client1);
    client1Output = output(client1);

    setScreen(new gameScreen(this));

}


public static ServerSocket hostServer(int port){
    try {
        return new ServerSocket(port);
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to host server!");
        return null;
    }
}

public static BufferedReader reader(Socket socket){
    try {
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to get input stream!");
        return null;
    }
}

public static PrintStream output(Socket socket){
    try {
        return new PrintStream(socket.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to create output stream!");
        return null;
    }
}

public static Socket waitForConnections(ServerSocket server){
    try {
        return server.accept();
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to accept connection!");
        return null;
    }
}
当我使用桌面项目时,它可以工作,但是当我使用android项目时,它就不工作了

错误:



如果有人有类似的问题或找到了解决方案,请告诉我。

是否在UI线程/活动中建立了客户端网络连接?如果是这样的话,网络连接应该建立在一个单独的线程中,例如用于短操作的AsynTask和用于长流操作的服务

客户端网络连接是否在UI线程/活动中建立?如果是这样的话,网络连接应该建立在一个单独的线程中,例如用于短操作的AsynTask和用于长流操作的服务

当您的电脑上的服务器已启动时,只要您尝试连接到localhost/127.0.0.1,您就无法从电脑以外的其他设备进行连接。只有将应用程序作为桌面应用程序在您的pc上运行时,连接才能正常工作,因为客户端和服务器位于同一主机上。对于其他客户端,您需要连接到电脑的本地LAN IP地址。当您尝试从手机连接到localhost/127.0.0.1时,它正在寻找手机上运行的服务器,但事实并非如此。

当您电脑上的服务器已启动时,只要您尝试连接到localhost/127.0.0.1,就无法从pc以外的其他设备进行连接。只有将应用程序作为桌面应用程序在您的pc上运行时,连接才能正常工作,因为客户端和服务器位于同一主机上。对于其他客户端,您需要连接到电脑的本地LAN IP地址。当您尝试从手机连接到localhost/127.0.0.1时,它正在寻找手机上运行的服务器,但事实并非如此。

假设您的电脑和安卓设备都连接到同一LAN(连接到同一路由器),您应该尝试使用服务器的内部IP地址(通常看起来像:10.0.0.X或192.168.X.X),您可以通过在Windows PC的命令行上运行
ipconfig
命令或在Linux/MAC上运行
ifconfig
来找到该地址。如果您的PC和Android设备连接到不同的网络,那么您应该像在示例中一样使用服务器的外部IP地址。如果是后者,您还应该将使用的端口(1234)转发到路由器中的PC。

假设您的PC和Android设备都连接到同一LAN(连接到同一路由器),您应该尝试使用服务器的内部IP地址(通常看起来像:10.0.0.X或192.168.X.X),您可以通过在Windows PC的命令行上运行
ipconfig
命令,或在Linux/MAC上运行
ifconfig
来找到它。如果您的PC和Android设备连接到不同的网络,那么您应该像在示例中一样使用服务器的外部IP地址。如果是后者,您还应将使用的端口(1234)转发到路由器中的PC。

您的LogCat屏幕截图是来自非您应用程序的警告。请详细解释“它不工作”是什么意思。它会因这个异常而崩溃。我还在清单文件中添加了一个USES-INTERNET权限。我需要更多权限吗?“此异常导致崩溃”--同样,堆栈跟踪似乎不是来自你的应用程序。你怎么知道?现在我们正在取得进展。但是,您的客户端代码表示它正在通过
127.0.0.1
进行连接。堆栈跟踪显示通过
78.61.65.198
连接的客户端代码。这些不一样,这表明客户端代码与堆栈跟踪不匹配。此外,在将来,请复制并粘贴堆栈跟踪的文本,以用于堆栈溢出问题,而不是难以阅读的屏幕截图。您的LogCat屏幕截图是来自非您的应用程序的警告。请详细解释“它不工作”是什么意思。它会因这个异常而崩溃。我还在清单文件中添加了一个USES-INTERNET权限。我需要更多权限吗?“此异常导致崩溃”--同样,堆栈跟踪似乎不是来自你的应用程序。你怎么知道?现在我们正在取得进展。但是,您的客户端代码表示它正在通过
127.0.0.1
进行连接。堆栈跟踪显示通过
78.61.65.198
连接的客户端代码。这些不一样,这表明客户端代码与堆栈跟踪不匹配。另外,在将来,请复制并粘贴堆栈跟踪的文本以用于堆栈溢出问题,而不是难以阅读的屏幕截图。这不会导致“连接被拒绝”。对,谢谢。似乎在活动中调用了socket.isConnected()。这不会导致“连接被拒绝”。好的,谢谢。似乎在活动中调用了socket.isConnected()。