Java——套接字编程

标签 java multithreading sockets

我阅读和观看的所有关于 java 套接字编程的教程都涉及一个常见的基本词,即 localhost。我玩 java 服务器客户端程序有一段时间了,做了一些实验。但每次,我的计算机既是服务器又是客户端,所以当其他计算机尝试连接到我计算机上托管的服务器时,我不太明白如何让事情正常进行。

以下面的基本服务器-客户端类为例:

服务器级

public class TestServerSocket {

    public static void main(String args[]) throws IOException {
        final int portNumber = 444;
        System.out.println("Creating server socket on port " + portNumber);
        ServerSocket serverSocket = new ServerSocket(portNumber);

        while (true) {
            Socket socket = serverSocket.accept();
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os, true);
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

             //...code...
       }
            socket.close();
            pw.close();
            os.close();
            br.close();
    }
}

客户端类

public class TestClientSocket {

    public static void main(String args[]) throws IOException {
        final String host = "localhost";
        final int portNumber = 444;
        System.out.println("Creating socket to '" + host + "' on port " + portNumber);

        while (true) {
            Socket socket = new Socket(host, portNumber);
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader userInputBR = new BufferedReader(new InputStreamReader(System.in));

            //...code...

        }
            socket.close();
            out.close();
            br.close();
            userInputBR.close();
     }
}

现在,假设我想在我的计算机上运行 TestServerSocket,让我的 friend 在他的计算机上运行 TestClientSocket。必须对此代码进行哪些更改才能使其正常工作?

最佳答案

“localhost”本质上是您的环回 IP 地址 127.0.0.1 的别名

为了让您的 friend 连接到您的服务器,代码必须用您服务器的 IP 地址代替“localhost”。

需要注意的重要一点,如果您的 friend 不在您的本地网络上,您将不得不使用您的出站 IP 地址和端口转发路由器上的正确端口。不过,如果您不熟悉这种类型的网络,我不会尝试。如果您不小心,即使您很小心,也可能会遭受无数基于网络的攻击。<​​/p>

关于Java——套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790698/

相关文章:

java - 如何使用 Velocity API 获取静态(非模板)内容?

java - 我想要按照我执行测试用例的顺序进行报告。我该如何配置它?

c# - 使用文本和 ProgressBars 填充 DataGridView

java - 了解 Java 线程中的等待

java - 断线组java api

c++ - 每个进程或每台计算机的线程 ID 是唯一的吗?

c# AsyncSocket 服务器需要锁定?

c++ - Boost::asio socket - 如何在 'throw' 中创建 read_some "timeout"?

linux - 通过 accept(..) 函数返回奇怪的客户端地址

java - 在java应用程序中执行curl命令