過去幾天我一直在使用TCP/IP通信(使用Java和C#)搞了很多。我瞭解它是如何工作的並且能夠使用它。我的問題更多的是一個代碼設計問題,它是如何完成一個真正的溝通的最佳和簡單的方法。網絡通信TCP [代碼設計]
例如我構建了我自己的多用戶聊天服務器。我希望我的通信能夠決定採用Auth請求還是新聊天消息能夠獲取當前用戶列表等。
我自己實現了幾種方式,但我不太滿意因爲我認爲這是一種更加標準和美觀的方式。
我首先想到的是用分隔符至極一個字符串被分裂,這是我在Java中我的通信實現的例子:
//The Object-types im Using
clientSocket = new Socket(host, port_number);
_toServer = new PrintStream(clientSocket.getOutputStream());
_fromServer = new DataInputStream(clientSocket.getInputStream());
//Example Commands my Client sends to the server
_toServer.println("STATUS|"); //Gets the Status if server is online or closed (closed can occur when server runs but chat is disabled)
_toServer.println("AUTH|user|pw"); //Sends an auth Request to Server with username and Password
_toServer.println("MESSAGE|Hello World|ALL"); //Sends hello World in the Normal Chat to all Users
_toServer.println("MESSAGE|Hello World|PRIVATE|foo"); //Sends hello World only to the user "foo"
_toServer.println("USERS|GET"); //Request a list of all Connected Users
//Example In the Recieved Message Method where all The Server Messages Get Analyzed
serverMessage = _fromServer.readLine(); //Reads the Server Messages
String action = serverMessage.split("|")[0];
if (action.equals("USERS")) { //Example "USERS|2|foo;bar"
String users[] = serverMessage.split("|")[2].split(";");
}
if (action.equals("MESSAGE")) { //Example "MESSAGE|Hello World|PRIVATE|foo"
if(serverMessage.split("|")[2].equals("ALL") {
//Code and else for private....
}
}
if (serverMessage.equals("STATUS|ONLINE")) {
// Code
// I leave out //Code and } for the next If statements
}
if (serverMessage.equals("STATUS|OFFLINE")) {
if (serverMessage.equals("AUTH|ACCEPTED")) {
if (serverMessage.equals("AUTH|REJECT")) {
這是方法的正常進行?廣告你看我需要發送與代碼對應的狀態碼和對象。香港專業教育學院思想以字節爲藏漢寫入數據,並實現了「爲每個對象解碼器」,例如:
int action = _fromServer.readInt();
//opcodes is just an Enum Holding the corresponding int
switch(action) {
case(opcodes.MESSAGE):
break;
case(opcodes.AUTH):
break;
}
注意,這是更比一般的設計問題不只是這個聊天服務器實例,我認爲,即時通訊實現一個基於網絡的控制檯遊戲只是爲了練習。
有沒有更好的方法來做到這一點,甚至是一個API /框架?
在此先感謝!
感謝您的快速答案,我已經搞砸了幾個遊戲,這有一個Documented Protocoll和那些總是像我的第二個例子,第一個4/8字節是行動代碼,其餘的數據如下。我希望有一些東西像接口一樣在對象上實現,以便能夠將em轉換成這樣的協議形式 – Angelo 2012-02-27 10:59:35