2011-10-25 110 views
3

我正在製作一個java程序&我希望它既是服務器又是客戶端(使用套接字)。這最好如何實現?雙向連接

+0

你的意思是你要兩次啓動程序並希望實例進行通信?或者你計劃開始更多的實例?或者你的程序將成爲其他程序的服務器,另一個程序的客戶端? – pgras

+0

該程序將在兩臺不同的機器上運行,它們將交換數據 –

回答

0

如果希望每個站充當服務器和客戶端,如P2P聊天,

你應該實現一個線程有一個ServerSocket,偵聽傳入連接,一旦有一個連接,打開新的線程來處理它,所以當前的將繼續監聽新的連接。

爲了使它能夠連接到其他人,使用簡單的SocketAddress和插座,在不同的線程嘗試連接到指定的服務器地址(例如,通過用戶的朋友列表)

你可以找到大量使用Google搜索的聊天示例。

歡呼聲。

7

如果你的意思是你想都發送接收數據,一個普通插座(每臺計算機上)會做得很好。見Socket.getInputStreamSocket.getOutputStream

通常的「服務器」/「客戶端」區別只是歸結哪個主機正在偵聽傳入連接,以及哪些主機連接到這些主機。一旦建立連接,您就可以從兩端發送和接收數據。

如果你想同時主機傳入連接,然後就成立了ServerSocket,並呼籲在兩臺主機上accept

相關鏈接:

+0

我試過這段代碼,但它無效:import java.io.*; import java.net。*; public class Server public static void main(String args [])throws Exception ServerSocket Server = new ServerSocket(6000); Socket connected = Server.accept(); Socket clientSocket = new Socket(「localhost」,6000); System.out.println(clientSocket.getInetAddress()); } } –

+0

我一直在socket.accept後等待 –

+1

您需要將該程序拆分爲兩個程序。接受將阻止,直到客戶端連接! – aioobe

0

如果你希望程序執行相同的操作,無論它是否是某個連接的服務器或客戶端,我可以想象將客戶端SocketServerSocket.accept()生產的套接字交給處理的相同方法。

0

看看jgroups它是一個庫,它允許創建成員可以相互發送消息的進程組。另一種選擇是使用hazelcast ...

你也可以看看this question

-2

做到這一點,最好的方法是運行在一個線程的服務器:在運行server.accept()因此當程序正在監聽任何你想要的主線程上線,你可以做一個連接

,甚至連接到另一臺服務器,因此使程序都成爲服務器&客戶端。

+0

OP說:「程序將運行在兩臺不同的機器上,它們將交換數據」,這是公認的答案?! – mbx

+0

@mbx它必須聽起來很笨,但它解決了這個問題 –

+0

也許仔細看看你的代碼將有助於理解(以前的)問題。那麼,如果它真的起作用了,而且你用它的工作方式很好,你可以留出來發布代碼。 – mbx