连接两个客户端套接字

Her*_*che 13 java sockets client serversocket

假设Java有两种套接字:

  • 服务器套接字"ServerSocket"
  • 客户端套接字或只是"套接字"

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

X =客户
Y =服务器

服务器进程Y:有一个"ServerSocket",即正在侦听TCP端口
客户端进程X:通过"Socket"向Y发送连接请求.

Y:然后该accept()方法返回一个新的客户端类型"Socket",
当它发生时,两个套接字得到"互连",

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

但是......
如果我在同一个进程中创建两个Client套接字,我想让它们"互连"怎么办?

......甚至可能?

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

我已经通过创建两个Thread来连续读取A和写B来解决它,而另一个用于读取B和写入A ......
但我认为这可能是更好的方式......(那些世界耗能的线程不是必需的使用客户端 - 服务器方法)

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


编辑:

应用示例:"现有服务器应用程序可以转换为客户端应用程序",例如VNC服务器,一个客户端套接字连接到VNC服务器,并创建其他客户端套接字(连接到中间服务器),然后应用程序互连两个客户端导致VNC服务器是客户端应用程序!然后,不需要公共IP.

VNCServer --- MyApp ---> |中间服务器| <---用户

Mar*_*aux 17

首先,不要将接受的客户端(服务器端)调用其套接字a Client Socket.这非常令人困惑.

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

那是不可能的.你总是需要建立一个服务器端,它可以接受客户端.现在的问题是:连接的哪一侧应该是服务器端?
你决定要考虑的事情:

  • 服务器应具有静态公共IP.
  • 连接路由器后的服务器必须进行"端口转发".(见UPnP)
  • 客户端必须知道它必须连接到哪个主机(公共IP)

中间服务器

我不知道你想用第三台服务器做什么.也许持有VNCServer的公共IP?*Elister*写道,你想在客户端和VNCServer之间建立一个brigde.我没有看到它的优点.

为什么不立即建立与VNCServer的连接?

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


      /   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连接到主服务器.那么,主服务器就获得了VNCServer的IP.
(2)客户端连接到主服务器.
(3)现在主服务器知道服务器和客户端在哪里.然后他发送到服务器所在的客户端.然后客户端将连接到他从主服务器收到的IP.这当然是来自VNCServer的IP.
(5)正在运行的VNCServer是服务器以接受客户端.

现在可以启动桌面共享.

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

  • 我<3 ASCII艺术,+ 1 (2认同)

Eri*_*lje 5

你为什么要这么做?

如果你想拥有一个"点对点"类型的系统,那么你只需让每个客户端同时运行一个客户端和一个服务器套接字 - 服务器套接字用于接受来自其他客户端的连接和客户端套接字以建立与其他客户端的连接.

ETA:在原始问题中你所询问的内容并不完全清楚,但是自从你编辑后,你似乎想要创建一种代理服务器.

在您的示例中,您的应用程序将创建两个客户端套接字,一个连接到VNCServer,另一个连接到"中间服务器".然后,"中间服务器"将有两个服务器套接字(一个用于您的应用程序连接,一个用于用户连接.在内部,它将需要知道如何匹配这些套接字并在两者之间传送数据.