【问题标题】:Two Way Connection两路连接
【发布时间】:2011-12-14 20:02:02
【问题描述】:

我正在制作一个 java 程序,我希望它既是服务器又是客户端(使用套接字)。如何最好地做到这一点?

【问题讨论】:

  • 您的意思是您要启动程序两次并希望实例进行通信?或者您打算启动更多实例?或者你的程序将成为其他程序的服务器和另一个程序的客户端?
  • 程序将在两台不同的机器上运行,它们将交换数据

标签: java networking


【解决方案1】:

如果您的意思是要同时发送接收数据,那么单个常规套接字(在每台计算机上)就可以了。请参阅Socket.getInputStreamSocket.getOutputStream

通常的“服务器”/“客户端”区别只是归结为哪个主机正在侦听传入连接,以及哪些主机连接到这些主机。建立连接后,您可以从两端发送和接收。

如果您希望两台主机监听传入连接,那么只需在两台主机上设置ServerSocket 并调用accept

相关链接:

【讨论】:

  • 我尝试了这段代码,但它不起作用:import java.io.*;导入java.net.*;公共类服务器 { public static void main (String args[]) throws Exception { ServerSocket Server = new ServerSocket(6000);套接字连接 = Server.accept();套接字 clientSocket = new Socket("localhost", 6000); System.out.println(clientSocket.getInetAddress()); } }
  • 您需要将该程序拆分为两个程序。接受将阻塞,直到客户端连接!
  • 但我真的做不到>.
  • @SamanthaCatania 然后编写您的程序,使其表现得像两个不同的程序(例如,使用命令行开关:java -jar myapp.jar --server --port 60042java -jar myapp.jar --client --connect ipofserver:60042
  • @mbx 我可以做到,但你的普通用户不能
【解决方案2】:

如果您希望每个站点都充当服务器和客户端,例如 p2p 聊天,

你应该用一个 ServerSocket 实现一个线程,监听传入的连接,一旦它得到一个连接,打开一个新的线程来处理它,这样当前的线程就会继续监听新的连接。

为了它能够连接到其他人,简单地使用SocketAddress和Socket,在不同的线程中尝试连接到指定的服务器地址(例如通过用户的朋友列表)

您可以通过谷歌搜索找到大量聊天示例。

干杯。

【讨论】:

    【解决方案3】:

    如果您希望程序执行相同的操作,无论它是某个连接的服务器还是客户端,我可以想象将客户端 SocketServerSocket.accept() 生成的套接字都交给同一个处理方法。

    【讨论】:

      【解决方案4】:

      看看jgroups,它是一个库,它允许创建进程组,其成员可以相互发送消息。另一种选择是使用hazelcast...

      你也可以看看this question

      【讨论】:

        【解决方案5】:

        最好的方法是在线程上运行服务器:

        您运行server.accept(),因此当您的程序在该线程上侦听连接时,您可以在主线程上做任何您想做的事情,甚至连接到另一台服务器,从而使程序既是服务器又是客户端。

        【讨论】:

        • OP 说“程序将在两台不同的机器上运行,它们将交换数据”,这是公认的答案?!
        • 也许仔细查看您的代码将有助于理解(以前的)问题。好吧,如果它确实有效并且您对它的工作方式感到满意,您可以腾出时间发布代码。
        • @mbx 其实很简单;您运行 server.accept() 因此,当您的程序正在侦听该线程上的连接时,您可以在主线程上做任何您想做的事情,甚至连接到另一台服务器,从而使程序既是服务器又是客户端。
        • @SamanthaCantania 是缺失的部分,服务器和客户端是设计驱动的决策,而不是用户驱动的
        猜你喜欢
        • 2018-10-31
        • 2014-01-27
        • 2023-04-09
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        相关资源
        最近更新 更多