2012-08-06 137 views
2

我正在編程套接字連接。服務器和客戶端。服務器通過socket.accept();等待連接,然後可以處理所有傳入的消息。套接字連接 - 消息順序?

到目前爲止好,但我怎樣才能控制這些消息?目前,我只看到服務器期望某個消息,並且客戶端必須發送此消息。這可能是一個String消息。 但是如果客戶端發送另一條消息,例如Integer?我怎樣才能讓服務器期望不同的消息?並根據參數類型和參數數量決定執行哪種方法?

或者是一個套接字,用於在客戶端和服務器之間以衆所周知的順序交換消息?

特別我正在尋找某種東西,例如在服務器端提供例如processIntegergetString()方法。如果我從客戶端發送消息,基於這些消息,我想執行其中一種或其他方法。 我可以通過客戶端以某種方式控制此消息所用的方法嗎?

+0

你可以檢查傳入的對象是一個實例。 – Vulcan 2012-08-06 20:11:27

+0

你在說什麼http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html? – mfrankli 2012-08-06 20:12:15

+0

是的,我使用這個插座。 OK實例可能值得一試。但是我仍然無法真正控制消息順序。 – membersound 2012-08-06 20:13:48

回答

0

套接字連接用於傳輸您想要的任何類型的消息。消息的「原始」字節通過它發送。定義消息的格式(字符數據 - 字符串,整型或其他類型的對象,二進制數據等)並不取決於套接字。隨你便。消息順序(請求和響應)由您定義。消息格式,序列和其他行爲一起被稱爲傳輸和/或消息「協議」。

您可以定義和實現自己的協議,或者使用現有的協議,或協議的組合,如HTTP,RMI,XML,JSON,等等,等等

祝你好運! Tom

0

Unix樣式的套接字(如Java使用的)不會呈現傳遞結構化(「類型」)數據的Abstraction。相反,它們表示任意字節流。唯一能給出結構的是當客戶端和服務器就如何通信(協議)達成一致時。正如你可能從文檔中注意到的,實際從Socket中獲取數據的唯一方法是使用getInputStream(),它可以讓你讀取(),它可以給你一個單獨的byte或者一個byte[]

例如,如果客戶要發送String,也許這將令「STR」作爲前三個字節的消息,並且如果它是一個Integer它的「詮釋」或「DBL」爲Double等上。如果服務器知道前三個字節表示數據類型,則可以使用它來了解如何讀取該消息的其餘部分。這是基本上所有網絡的基礎 - 客戶端和服務器使用相同的「語言」。

0

Java教程頁面解釋起來非常簡單:Java Tutorials: Sockets

您可以發送可序列化的對象在服務器上發送和反序列化。當然,可序列化的類必須在客戶端和服務器中定義。

您可以使用ObjectInputStream和ObjectOutputStream來讀寫這些對象。