2015-09-14 132 views
1

我有一個Java服務器,它將具有兩種不同類型的客戶端,一個基於Java的控制檯和一個基於Lua的客戶端,服務器將控制該客戶端。我已經得到了Lua的客戶攀談來回通過TCP套接字與ObjectInputStream,Java和Lua客戶端進行網絡連接

out = new PrintWriter(socket.getOutputStream(), true); 
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

現在我想獲得一個基於Java的客戶端連接,我想用

out = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream())); 
in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); 

我遇到的問題理解接受連接的最佳方式,不知道它是否是另一端的Lua或Java客戶端。然後設置合適的流。

我應該只在初始連接上使用不同的端口嗎?我希望更多的是從BufferedReader可以讀取的ObjectOutputStream發送一個字符串。或者,如果它是PrintWriter或ObjectOutputStream,則應在設置之前使用較低級別的內容查看連接的內容。

指向深入教程或實際代碼的鏈接將起作用。我無法找到超出其中一個或另一個的基本設置的資源。

謝謝先進。

+0

如果您不是專門使用Java客戶端,則不應該使用ObjectOutputStream。使用XML或JSON等標準傳輸格式,或設計精確的二進制記錄格式。 – RealSkeptic

+0

你會在XML或JSON之間推薦什麼?我對這兩個人的經歷都差不多,這很少。 – Ditchbuster

+0

JSON更簡單,我會說,並且是專門爲表示對象而設計的。如果你沒有選擇XML的特定理由,那麼我更喜歡JSON。但是,可能你甚至不需要這個。這取決於你需要交換的消息的性質。 –

回答

1

由於您建議提供聽起來像兩個完全不同的服務,因此在不同的端口提供這些服務是自然而恰當的。爲了實現這一點,你的服務器將創建和管理兩個單獨的,在不同的端口上監聽。一會提供一項服務;另一個會提供另一個。您可以使用任一線程或Selector或其組合來處理兩個服務器套接字和所有客戶端。

作爲一個單獨的問題,我建議您在依賴Object流之前仔細思考。如果您可以在更簡單和/或更一般的協議的基礎上實現您的服務,那麼您將避免Java序列化的多重歡樂,並且您還將爲使用其他語言編寫的客戶端敞開大門。

+0

謝謝!我已經有客戶的線程。你在想每個'ServerSocket'的線程嗎?這似乎是很自然的事情。我看看'Selector'。感謝Java序列化的領導,這個項目可能很簡單,可以手動發送字符串或字節。 – Ditchbuster

+0

是的,因爲給定的線程一次只能在一個'ServerSocket'上接受()',所以你需要一些方法來監視哪一個已準備好,否則要同時服務兩者。一個'選擇器'可以在一個線程中完成前者;後者需要爲每個「ServerSocket」分開一個線程。 –