java - 网络通信TCP【代码设计】

标签 java networking tcp udp

最近几天我一直在处理 TCP/IP 通信(使用 Java 和 C#)。我了解它的工作原理并且能够使用它。我的问题更像是一个代码设计问题,它是如何以最好和最简单的方式进行真正的交流的。

例如,我构建了自己的多用户聊天服务器。我希望我的通信能够决定它是一个 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")) {

这是正常完成的方式吗? Ad You See 我需要发送 Statuscodes 和与代码对应的对象。我也考虑过以字节为单位写入数据并实现“每个对象的解码器”,示例:

int action = _fromServer.readInt();     

//opcodes is just an Enum Holding the corresponding int

switch(action) {
  case(opcodes.MESSAGE):
    break;
  case(opcodes.AUTH):
    break;         
 }

请注意,这不仅仅是一个一般的设计问题,不仅仅是这个聊天服务器示例,我认为我只是为了练习而实现一个基于网络的小型控制台游戏。

是否有更好的方法或什至是 API/框架?

提前致谢!

最佳答案

本质上,您是在设计一个协议(protocol)。有许多通信协议(protocol)可以处理这个问题,我想到的主要协议(protocol)是 IRC。我相信您可以在网络上搜索有关如何实现该协议(protocol)的提示。

至于为控制台游戏扩展类似的内容,我将从实现 IRC 开始,并使用它来学习如何编写真正的通信协议(protocol)。完成后,您可以在此基础上进行构建,将您自己的命令添加到您的框架中。

关于java - 网络通信TCP【代码设计】,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9463706/

相关文章:

java - 我们可以使用像数组索引这样的索引来访问 List<T> 吗?

c - 如何使用C程序设置计算机的IP地址?

c - 有没有办法用 C ping 一个特定的 IP 地址?

c# - EndReceive 永远不会返回 0,你怎么知道数据包在 tcp/ip 中何时完成?

java - 哪个引用变量为空 - 尝试从空对象引用的字段 'android.os.Handler android.support.v4.a.m.a' 读取

java - 如何使用Java从MySQL获取实时数据

Java cucumber : Take @CucumberOptions from external source like a property file

javascript - 通过网络流式传输麦克风音频输入(RAW PCM)

silverlight - 用于 silverlight 的 Modbus Tcp

python - 类型错误 : Connect() takes exactly one argument