连接两个客户端套接字

2022-09-03 12:28:48

假设Java有两种套接字:

  • 服务器套接字“服务器套接字”
  • 客户端套接字或只是“套接字”

想象一下两个过程的情况:

X = 客户端
Y = 服务器

服务器进程Y:有一个“ServerSocket”,即侦听TCP端口
客户端进程X:通过“套接字”向Y发送连接请求。

Y:然后该方法返回一个新的客户端类型“Socket”,
当它发生时,两个Socket被“互连”,accept()

所以:客户端进程中的套接字,与服务器进程中的套接字连接。
然后:通过套接字 X 读取/写入就像通过套接字 Y 读取/写入一
样。现在,两个客户端套接字相互连接!!

但。。。
如果我在同一进程中创建两个客户端套接字,并且我想让它们“互连”,该怎么办?

...甚至可能?

假设如何在不使用中间 ServerSocket 的情况下使两个客户端套接字互连?

我通过创建两个线程来解决它,用于连续读取A和写入B,另一个用于读取B和写入A...
但我认为这可能是一个更好的方法...(那些耗费全球能量的线程在客户端-服务器方法中不是必需的)

任何帮助或建议将不胜感激!谢谢


编辑:

应用程序示例:“可以将现有的服务器应用程序转换为客户端应用程序”,例如 VNC 服务器,一个客户端套接字连接到 VNC 服务器,并创建另一个客户端套接字(连接到中间服务器),然后应用程序将两个客户端互连,从而使 VNC 服务器成为客户端应用程序!然后,不需要公共IP。

VNCServer---MyApp---> |middle server|<---用户


答案 1

首先,不要将已接受的客户端(服务器端)的套接字称为 。这是非常令人困惑的。Client Socket

假设如何在不使用中间 ServerSocket 的情况下使两个客户端套接字互连?

这是不可能的。您始终必须创建一个可以接受客户端的服务器端。现在的问题是:连接的哪一端应该是服务器端?
这个决定你必须考虑的事情:

  • 服务器应具有静态公共 IP。
  • 在连接路由器之后的服务器必须进行“端口转发”。(请参阅 UPnP)
  • 客户端必须知道它必须连接到哪个主机(公共 IP)

中间服务器

我不明白你想用第三台服务器做什么。也许持有VNCServer的公共IP?*Elister*写道,你想在客户端和VNCServer之间做一个桥。我看不出它有什么好处。

为什么不立即连接到 VNC 服务器?

但是如果你真的想要它,你可以做这样的情况:

      /   VNCServer (Server Running)  <---.
     |                                     |
LAN -|                             Connects to VNCServer
     |                                     |
      \   MyApp (Server Running --> Accepts from Middle Server) <------.
                                                                        |
                                                            (Through a router)
                                                                        |
     Middle server (Server Running --> Accepts client) ---> Connects to Your App
                                             ^
                                             |
                                    (Through a router)
                                             |
     Client --> Connects to Middle Server --°

这就是没有第三台服务器的外观(我推荐你):

      /   VNCServer (Server Running)  <---.
     |                                     |
LAN -|                             Connects to VNCServer
     |                                     |
      \   MyApp (Server Running --> Accepts Clients) <------.
                                                             |
                                                      (Through a router)
                                                             |
     Client --> Connects to MyApp --------------------------°


编辑:

我想我现在明白了:

我们必须像这样可视化您的情况:

                             Your Main Server (What you called middle server)
                    (1)         |       |      (2)
            /⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻/         \⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻\
           |                                                |
      Your VNCServer   <---------------------------->   The client
         (5)                        (3)

(1)虚拟服务器连接到主服务器。因此,然后主服务器获得了VNCServer的IP。
客户端连接到主服务器。
现在主服务器知道服务器和客户端的位置。然后,他发送到服务器所在的客户端。然后,客户端将连接到他从主服务器收到的IP。这当然是来自VNCServer的IP。
正在运行的 VNC 服务器是服务器接受客户端。(2)(3)(5)

现在,桌面共享可以开始了。

我认为这是您可以拥有的最推荐的情况。
当然,用Java编写它是给你的。


答案 2

为什么需要这样做?

如果要具有“对等”类型的系统,则只需让每个客户端同时运行客户端和服务器套接字 - 服务器套接字用于接受来自其他客户端的连接,客户端套接字用于建立与其他客户端的连接。

ETA:在最初的问题中,你问的不是很清楚,但是自从你的编辑以来,似乎你正在寻求创建一种代理服务器

在你的示例中,你的应用将创建两个客户端套接字,一个连接到 VNCServer,另一个连接到“中间服务器”。然后,“中间服务器”将具有两个服务器套接字(一个用于你的应用连接到,另一个供用户连接到)。在内部,它需要知道如何匹配这些套接字并在两者之间穿梭数据。


推荐