Android:无法创建套接字

时间:2016-02-27 15:41:13

标签: 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("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项目时,它无法正常工作。

错误:enter image description here

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果您的电脑上的服务器是初始设备,只要您尝试连接到localhost / 127.0.0.1,就无法从除PC之外的其他设备连接。只有当您在PC上运行应用程序作为桌面应用程序时,连接才会起作用,因为客户端和服务器位于同一主机上。对于其他客户端,您需要连接到PC的本地LAN IP地址。当您尝试从手机连接到localhost / 127.0.0.1时,它正在寻找在手机上运行的服务器,但事实并非如此。

答案 2 :(得分:-1)

客户端网络连接是否在UI线程/活动中建立?如果是这样,网络连接应该在单独的线程中建立,例如。 AsynTask用于较长的流操作的短操作和服务。 http://developer.android.com/training/basics/network-ops/connecting.html#AsyncTask