- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试设计一个服务器/客户端架构,我想请教你们以确定表示和解析不同类型数据包的最佳方式。需要对每种数据包类型进行不同的解析。下面代表我会看到的数据包类型。
[*packet_type*][length][variable length data]
*packet_type* describes the type of packet we're sending (client login, server returning authentication, data, etc)
length describes how much data to read
variable length data contains the info to be sent. it will be specialized based on the packet_type. the data will be variable regardless of
我调查了 tcphdr struct,我想我可以使用类似类型的 header 来表示 *packet_type* 和长度。然后,我将使用字符串来表示数据。
public class Packet {
public enum PKT_TYPE {
CL_REGISTER,
CL_LOGIN,
SRV_AUTH,
SRV_GAME_INFO,
}
PKT_TYPE _packet_type;
int _length;
String _data;
}
现在有了一个共同的基础,我想我可以为每个 *packet_type* 实现类和发送/接收方法。但是,我觉得这不是很可扩展,而且很难维护。一个(粗略的,伪的)例子是
public class Packet {
...
public class Pkt_CL_LOGIN extends Packet {
String _loginname;
String _password;
public boolean send() {
//socket.write(CL_LOGIN, length, _loginname+_password);
}
public Pkt_CL_LOGIN parse(String data) {
//removed header already, so first byte will be data
//extract login + password
_loginname = login;
_password = password;
return this;
}
}
public Packet receive() {
//read from socket
//parse header for packet_type
switch (packet_type)
case CL_LOGIN:
return (new Pkt_CL_LOGIN()).parse(data);
}
}
谁能给我一些关于如何以不同方式实现的建议?我不太确定是否有,但也许有更多经验的人可以给我一些见解(例如他们如何在多人游戏中做到这一点等)
谢谢!
最佳答案
我目前正在使用 Protocol Buffers 制作多线程 C++ 聊天服务器用于实际的协议(protocol)实现。重点是,我认为你应该使用它们:它们为你需要的每个数据包提供了一个漂亮的接口(interface),它们可以用于多种语言(C++、Java 和 Python 只是开始,我认为它们有一些 Ruby 接口(interface)作为好吧)并且它们允许您毫不费力地创建通用协议(protocol),因为它们消除了序列化问题以及为每个数据包编写自己的类的需要。此外,还有针对移动设备的特定“精简版”版本(如果您正在为 Android 编写代码,它可能会派上用场)。
关于数据包,我知道有两种方法可以跟踪数据包何时结束:第一种是固定长度的数据包,第二种是在实际发送数据包之前发送长度。这同样适用于数据包类型。如果你没有很多数据包类型,你可以只使用一个 unsigned char
(现在,这是 C++,但我想应该有一些方法可以在 Java 中做同样的事情)来表示它会为您提供恰好 255 种数据包类型(如果您问我,则多于所需)。
在我的服务器中,我实际上解决了发送一个包含数据包长度和类型(都是固定长度 uint32)的固定长度 header 的问题,然后对其进行解析,然后再次读取套接字以检索信息,然后相应地解析并发送到客户端处理程序中的适当处理程序。我认为这种方法非常好,除了......我正在使用一些额外的内存(数据包类型太大)......
作为 Protocol Buffer 的示例,您的 .proto 文件可能看起来像这样:
message Header {
required fixed32 length = 1;
required fixed32 type = 2; // Note: don't use an enum here, as the values are serialized to varint, which simply kills your fixedness.
}
message Login {
required string nickname = 1;
required string password = 2;
}
enum ErrorType {
BAD_HEADER = 0;
WRONG_PASSWORD = 1;
}
message Error {
required ErrorType type = 1;
optional string message = 2;
}
关于java - 数据包 : Effectively representing different packet types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247150/
我刚刚开始了解@ngrx/store 和@ngrx.effects,并在我的Angular/Ionic 应用程序中创建了我的第一个效果。它第一次运行正常,但如果我再次将事件发送到商店(即再次单击按钮时
是否可以将所有自定义表达式保存在外部 .jsx 文件中,以便我可以从项目内部调用它们? 例如,假设我有一个我经常使用的表达式,它将人偶工具指向一个空对象的位置。我知道我可以将该表达式转换为一个可以接受
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
谁能帮我指出正确的方向,如何在位图上使用这些 Android 4.0 以来可用的 GPU 加速效果? 文档指出例如“它们必须绑定(bind)到 GL_TEXTURE_2D 纹理图像”。但最好的方法是什
我有一个带有背景图像的大 UIButton,上面有五个小的不可见 UIButton。我想在按下一个不可见的小按钮时触发大按钮的突出显示效果。我怎样才能做到这一点? 请帮忙。非常感谢! 最佳答案 为所有
function* rootSaga() { yield all(sagas.map(saga => fork(saga))); } sagaMiddleware.run(rootSaga);
您好,我在将 Li 设置为事件选项卡时遇到问题,我已经添加了悬停效果但是如何添加事件选项卡?。我使用 Angular 的 ng-show 和 ng-hide 来更改 li 中的图标。这是我的代码
我已经将 redux-saga 升级到最新的 0.15.x 版本,并且我已经在 [...effects] 方面解决了很多弃用问题,取而代之的是 all([.. .effects]), 请更新你的代码
我试图理解在组件函数中产生副作用与在没有传入依赖项数组的效果中产生副作用(因此应该在每次渲染时触发)之间的实际区别。据我观察,它们都以相同的频率运行。我意识到效果允许在适当的时间进行清理,但我只是对清
当谈到排队 jQuery Effects 和 jQuery UI Effects 时,我真的很困惑。当我这样做时 $('#div_id').effect('bounce').effect('shake
我正在制作故障文字效果,效果非常好。 现在我正在尝试创建一个书写效果,效果也非常好! 但是两者一起都有一个小错误。 当我将鼠标悬停在文本上时,毛刺效果起作用,但是当书写效果向文本添加一个字母时,这个字
相关,但不是修复:jQuery issue - # has no method 当我尝试在 jquery 中使用 effect 函数时,出现错误 Object [object Object] has
我有一个具有四个 ngrx 操作的 Angular (2) 应用程序: 开始 不被 reducer 处理(没有状态变化) ngrx Effect 调用异步任务并映射到 SUCCESS 或 ERROR
在第16项:“使const成员函数线程安全”中有一段代码如下: class Widget { public: int magicValue() const { std::lock
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
下一行中的最后一行继续生成“警告 C4552:'<=':运算符无效;预期运算符有副作用”错误,但我没有看到任何错误... void countDays(void) { int i=0; if (bir
当我在列表框中使用滚动查看器时,当我通过触摸滚动到达列表框的末尾时,我的整个窗口都在弹跳。当我使用鼠标滚轮时,此行为不会出现。我怎样才能禁用这种过度滚动/橡皮筋效果/回弹效果/弹跳效果。 我在 Win
第 3.5.4 节讨论了有效不可变对象(immutable对象),也就是说,一旦一个对象被安全且完整地构建,它的状态就不会被任何代码路径的任何代码改变。 Goetz 爵士举了一个例子: For exa
我有一部电影在后期效果中没有背景的关键颜色,但背景仍然是静止的。 我想检测在静止背景前行走的 2 个人的运动并将他们带到前面,这样我就可以在背景上创建效果。 那有可能吗?我使用女巫效果吗? 最佳答案
在基于类的组件中: componentDidMount() { axios.get('https://jsonplaceholder.typicode.com/posts').then((re
我是一名优秀的程序员,十分优秀!