簡體   English   中英

當服務器位於專用網絡上時,使用TCP通過套接字在兩個設備之間發送字符串

[英]Sending a string between two devices through a socket using TCP when server is on a private network

當每個應用程序在不同的設備上並且接收設備在專用Wifi網絡上時,我試圖將一個Android應用程序中的字符串(以及以后的圖像)發送到另一個Android應用程序 (服務器正在偵聽專用IP:192.xx.xx.xx)。 當服務器連接到公共IP而非我想要的私有IP時,此代碼有效。

代碼“ SendString”是一部手機上的一個Android應用程序。 並且代碼“ AppListener”在另一部電話(這是服務器)上。 當AppListener連接到公共Wifi IP地址時,我能夠將字符串從SendString發送到AppListener。

“ SendString”,它將字符串發送到“ AppListener”:

(我發送的“ applicationName”字符串從項目中的另一個活動傳遞到“ SendString”)

public class SendString extends AsyncTask<String, String, String> {

@Override
protected String doInBackground(String... params) {

    Log.d("tag_name", "Entered AsyncTask");

    String applicationName = params[0];


    // SEND APPLICATION NAME AND ICON TO OTHER APP

    try {

        Log.d("tag_name", "TRY TO SEND STRING");
        Socket socket = new Socket("192.168.0.26", 1755);
        DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
        DOS.writeUTF(applicationName);
        Log.d("tag_name", "Application Name Sent!");
        socket.close();

    }

    catch (Exception e){

        Log.d("tag_name", "Did not send string");

    }

    return null;
}

}

“ SendString”代碼卡在打印語句“嘗試發送字符串”中,並且在該打印語句之后,它無法連接到另一部電話的IP。

這是偵聽端口連接的其他Android應用程序代碼(在服務器上),然后它應該從“ SendString”接收字符串。

public class AppListener extends AsyncTask<String, String, String> {



@Override
protected String doInBackground(String... uri) {

    String msg_received = null;

    System.out.println("LISTENING FOR LAST INSTALLED APP");

    try {


        System.out.println("TRY");
        ServerSocket socket = new ServerSocket(1755);
        System.out.println("Connect to Socket and listening");
        Socket clientSocket = socket.accept();       //This is blocking. It will wait.
        System.out.println("This should print after connection");
        DataInputStream DIS = new DataInputStream(clientSocket.getInputStream());
        msg_received = DIS.readUTF();

        System.out.println("Message from server" + msg_received);

        clientSocket.close();
        socket.close();
    } catch (Exception e) {
        System.out.println("Did not connect to SendString");
    }
    System.out.println("Return Statement is Reached");
    return msg_received;
}
}

問題是它似乎被卡在了生產線上

Socket clientSocket = socket.accept();       //This is blocking. It will wait.

當我的服務器連接到專用網絡時,有人知道如何使此連接正常工作嗎?

在此代碼行中:

Socket socket = new Socket("192.168.0.26", 1755);

你應該來代替私有IP 192.168.0.26的公網IP,你可以找到像一些網絡服務的一個公共IP進入這個

另外,您還需要驗證防火牆或路由器配置中的1755端口是否已打開,以打開傳入TCP連接。

希望它幫助。

暫無
暫無

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

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