java - 当客户端套接字连接到本地 IP 而不适用于全局 IP 时,客户端-服务器套接字连接有效。 (超过 4G 连接)

标签 java android sockets tcp client-server

您好,我是编程新手,在这里我尝试在 Android Studio 上使用 Java 创建客户端-服务器套接字连接,在一部 Android 手机上使用客户端套接字,在另一部手机上使用服务器套接字。当我在同一路由器上连接两部手机时,无论我使用哪个端口,代码都可以工作,并且使用内部 IP (192.168.1.4) 作为客户端套接字而不是全局 IP (183.90.37.22)。但是,如果我打开 4G 连接并在我的代码中使用全局 IP,则客户端套接字无法连接到另一部手机上的服务器套接字。但是,当使用端口 80 时,我设法看到 toasts 一直显示到“消息已发送”ALTHOUGH 在使用服务器套接字编码的电话中没有显示任何消息/toasts。我非常感谢我能得到的所有帮助,如果能给出关于如何将 TCP 端口分配给客户端和服务器套接字的详尽解释,那就太好了! =)

Client Socket 首先出现:

Button button = findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MessageSenderThread messageSender = new MessageSenderThread("messageSender");
            messageSender.start();
        }
    });

}

class MessageSenderThread extends Thread {
    private String threadName;
    private Thread t;

    MessageSenderThread(String s) {
        threadName = s;
    }

    @Override
    public void run() {
        try {
            showToast("Connecting to server...");
            Socket socket = new Socket("183.90.37.22", 80);
            showToast("Connection established");
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            PrintWriter printWriter = new PrintWriter(outputStreamWriter);
            printWriter.println("MESSAGE");
            printWriter.flush();
            showToast("Message sent");

            outputStream.close();
            outputStreamWriter.close();
            printWriter.close();
            socket.close();
            showToast("Socket closed");
        }
        catch (IOException e) {
            showToast("Connection FAILED");
        }
    }

    @Override
    public void start() {
        if (t == null) {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}

服务器端代码如下:

MessageReceiverThread messageReceiverThread = new MessageReceiverThread("messageReceiver");
messageReceiverThread.start();

class MessageReceiverThread extends Thread {
    private String threadName;
    private Thread t;

    MessageReceiverThread(String s) {
        threadName = s;
    }

    @Override
    public void run() {
        try {
            while (true) {
                ServerSocket serverSocket = new ServerSocket(5000);
                showToast("Server is listening...");
                Socket socket = serverSocket.accept();
                showToast("Connection established");
                InputStream inputStream = socket.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String message = bufferedReader.readLine();

                showToast(message);
                inputStream.close();
                inputStreamReader.close();
                bufferedReader.close();
                socket.close();
                serverSocket.close();
            }

        } catch (IOException e) {
            showToast("Connection FAILED");
        }
    }

最佳答案

您的移动服务提供商会阻止传入连接。

因此在无法访问的设备上运行服务器是没有意义的。

关于java - 当客户端套接字连接到本地 IP 而不适用于全局 IP 时,客户端-服务器套接字连接有效。 (超过 4G 连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49339807/

相关文章:

java - java中执行StoredProcedure时出现ArrayIndexOutOfBoundsException

android - 在 Android 中使用相机应用程序时,如何返回整个图像而不仅仅是缩略图?

java - Python 中相当于 Java InputStream 的 available 方法是什么?

java - 如何在Java套接字编程中解析index.html文件中包含的style.css的路径

javascript - 重新连接后未触发 socket.io 'connect' 或 'reconnect' 事件

java - 如何从存储过程中仅获取选定的表?

java - Java VM 是否移动内存中的对象,如果是,如何移动?

java - Java 中范围和包的问题

android - 使用 Parse 仅在本地存储数据

java - 没有 pojo 的改造和 GSON