簡體   English   中英

Android:無法創建套接字

[英]Android: cannot create socket

在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項目執行此操作時,它不起作用。

錯誤: 在此處輸入圖片說明

讓我知道是否有人遇到類似問題或找到了解決方案。

假設PC和Android設備都連接到同一LAN(連接到同一路由器),則應嘗試使用服務器的內部 IP地址(通常看起來是:10.0.0.X或192.168.XX),可以通過在Windows PC上的命令行上運行ipconfig命令或在Linux / MAC上的ifconfig來找到。 如果您的PC和Android設備連接到不同的網絡,則應像在示例中一樣使用服務器的外部 IP地址。 如果是后者,則還應該將使用端口(1234)轉發到路由器中的PC。

UI線程/活動中是否建立了客戶端網絡連接? 如果是這樣,則網絡連接應在單獨的線程中建立,例如。 AsynTask用於較短的操作,而服務則用於較長的流操作。 http://developer.android.com/training/basics/network-ops/connecting.html#AsyncTask

當服務器在您的PC上啟動時,只要您嘗試連接到localhost / 127.0.0.1,就無法從PC以外的其他設備進行連接。 僅當在PC上將應用程序作為桌面應用程序運行時,連接才有效,因為客戶端和服務器位於同一主機上。 對於其他客戶端,您需要連接到PC的本地LAN IP地址。 當您嘗試從手機連接到localhost / 127.0.0.1時,它正在尋找在手機上運行的服務器,事實並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM