【发布时间】:2011-12-14 20:02:02
【问题描述】:
我正在制作一个 java 程序,我希望它既是服务器又是客户端(使用套接字)。如何最好地做到这一点?
【问题讨论】:
-
您的意思是您要启动程序两次并希望实例进行通信?或者您打算启动更多实例?或者你的程序将成为其他程序的服务器和另一个程序的客户端?
-
程序将在两台不同的机器上运行,它们将交换数据
标签: java networking
我正在制作一个 java 程序,我希望它既是服务器又是客户端(使用套接字)。如何最好地做到这一点?
【问题讨论】:
标签: java networking
如果您的意思是要同时发送和接收数据,那么单个常规套接字(在每台计算机上)就可以了。请参阅Socket.getInputStream 和Socket.getOutputStream。
通常的“服务器”/“客户端”区别只是归结为哪个主机正在侦听传入连接,以及哪些主机连接到这些主机。建立连接后,您可以从两端发送和接收。
如果您希望两台主机监听传入连接,那么只需在两台主机上设置ServerSocket 并调用accept。
相关链接:
【讨论】:
java -jar myapp.jar --server --port 60042java -jar myapp.jar --client --connect ipofserver:60042
如果您希望每个站点都充当服务器和客户端,例如 p2p 聊天,
你应该用一个 ServerSocket 实现一个线程,监听传入的连接,一旦它得到一个连接,打开一个新的线程来处理它,这样当前的线程就会继续监听新的连接。
为了它能够连接到其他人,简单地使用SocketAddress和Socket,在不同的线程中尝试连接到指定的服务器地址(例如通过用户的朋友列表)
您可以通过谷歌搜索找到大量聊天示例。
干杯。
【讨论】:
如果您希望程序执行相同的操作,无论它是某个连接的服务器还是客户端,我可以想象将客户端 Socket 和 ServerSocket.accept() 生成的套接字都交给同一个处理方法。
【讨论】:
看看jgroups,它是一个库,它允许创建进程组,其成员可以相互发送消息。另一种选择是使用hazelcast...
你也可以看看this question。
【讨论】:
最好的方法是在线程上运行服务器:
您运行server.accept(),因此当您的程序在该线程上侦听连接时,您可以在主线程上做任何您想做的事情,甚至连接到另一台服务器,从而使程序既是服务器又是客户端。
【讨论】: