В последние несколько дней я много путаюсь с TCP / IP Communication (Используя Java и C #). Я понимаю, как это работает, и могу использовать это. Мой вопрос - это скорее вопрос разработки кода, как сделать лучший и простой способ создать реальное общение.
Например, я построил свой собственный многопользовательский чат-сервер. Я хочу, чтобы мое сообщение могло принимать решение, будь то запрос на аутентификацию или новое сообщение в чате, возможность получения текущего списка пользователей и т. Д. И т. Д.
Я реализовал несколько способов самостоятельно, но я не совсем доволен этим, так как я думаю, что есть более стандартный и красивый способ сделать это.
Моей первой мыслью была строка с разделителями, которая разбита, вот пример моей реализации моего общения в 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 / Framework?
Заранее спасибо!