java - 进程可以连接到自己创建的套接字吗?

标签 java

编辑:下面的代码不会引发异常,但没有输出并挂起。它应该输出“测试消息”。在 main() 中,我们启动一个线程,该线程给定一个在随机端口上监听的服务器套接字。主线程尝试在同一个随机端口上与 ServerSocket 连接并通信,但显然失败了。为什么?

public class IntraProcSockTest {
private static int port;

private class Listener extends Thread {
    public Listener() {
    }

    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(0);
            port = serverSocket.getLocalPort();
            Socket socket = serverSocket.accept();

            BufferedReader in;
            String fromClient;

            in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));

            while ((fromClient = in.readLine()) != null) {
                System.out.println("From client: " + fromClient);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public IntraProcSockTest() {
    new Listener().start();
}

public static void main(String[] args) {
    new IntraProcSockTest();

    try {
        Thread.sleep(5000);
        Socket socket = new Socket("localhost", port);
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());

        socketOut.println("Test message");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

最佳答案

进程可以连接到自己创建的套接字,没有问题。 向我们展示引发异常的代码和/或有关异常的更多详细信息。

首先,请注意不要为客户端套接字(连接到正在监听的另一个套接字的套接字)指定本地端口。让操作系统选择一个随机端口。请记住,任何套接字都由四个元素 (remote host, local host, remote port, local port) 标识。 ,如果将服务器套接字和客户端套接字绑定(bind)在同一个本地端口上,则将其设置为 4498 ,两个套接字定义如下: (localhost, localhost, 4498, 4498)这是行不通的。我怀疑这可能是你的问题。
为了避免此类问题,客户端套接字通常绑定(bind)到操作系统选择的随机端口。向我们展示您的代码,特别是创建客户端套接字并连接到服务器套接字的部分。

关于 IPC,使用套接字作为进程间甚至进程内通信技术并不总是不好。显然,性能更差,并且您可能会失去一些代码可读性,但您的软件将很容易移植到网络(分布式)应用程序。这取决于你的计划,它不像IPC套接字==不好。

关于java - 进程可以连接到自己创建的套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8118166/

相关文章:

java - 如何从一种方法返回 ArrayList 和文件数组?

Java - 正则表达式问题

java - RowFilter.NumberFilter : can't handle "mixed" concrete number types

java - 将字符串中的每个单词或数字组合加倍

java - 在 Spring 之上开发基于插件的架构

java - 我们如何递归列出所有文件和文件夹?

java - 如何从 Map<String,Map<Date,Statistics>> 向 Vaadin 表添加行?

java - 我应该包括什么(使用 maven)以在我的 Java 应用程序中使用嵌入式芝麻存储库

java - 重复 doGet 调用

java - Tomcat Servlet 文件上传和 UTF-8