java - 使用 Java 从 Sb0t 聊天服务器正确读取套接字数据包
问题描述
我的问题是关于 Java 的。我正在尝试从聊天服务器接收一个名为 MSG_CHAT_SERVER_PUBLIC 的包。这个包包含用户的名字和他发送的消息。该协议在此协议列表中:http ://uruguayos-xtremos2011.blogspot.com/p/ares-protocol-aresnuevo.html?m= 1 在 Public 方法中,您可以看到服务器如何形成包:https: //github.com/AresChat/sb0t/blob/128b2755cdfedaf498d66fbcdf9fda010f4d3087/core/TCPOutbound.cs
在 Service 方法中,您可以看到聊天客户端如何接收数据包:https ://github.com/AresChat/cb0t/blob/master/cb0t/RoomPanel/AresSocket.cs 在 Eval_Public 方法中您可以看到包是如何读取的在聊天客户端:https ://github.com/AresChat/cb0t/blob/master/cb0t/RoomPanel/Room.Handler.cs
我有以下代码(但 EditText 中没有出现读取包;我希望相反):
InputStream in = sock.getInputStream();
while (sock.isConnected()) {
// get message length, first 2 bytes
byte[] lengthBytes = new byte[2];
in.read(lengthBytes);
// convert to int
int messageLength = lengthBytes[0] << 8 | lengthBytes[1];
// get the protocol byte
int procotol = in.read();
// get message, length bytes
byte[] messageBytes = new byte[messageLength];
s.chat.append(Integer.toString(in.read(messageBytes)));
// separate message, first x bytes are username
int length = 0;
// get username length
for (byte messageByte : messageBytes) {
if (messageByte == 0) break;
length++;
}
// extract username
byte[] username = new byte[length];
System.arraycopy(messageBytes, 0, username, 0, length);
int pos = length + 1;
// message length
length = messageBytes.length - pos;
// extract message
byte[] message = new byte[length];
System.arraycopy(messageBytes, pos, message, 0, length);
s.chat.append("message length: " + messageLength + "\nprocotol: " + procotol + "\nusername: " + new String(username) + "\nmessage: " + new String(message));
}
如果我告诉你我到目前为止所做的事情,也许对你来说会更容易:https ://1drv.ms/u/s!An2GIBqaxDQCgTZ_PCnapHpoRjny
在此先感谢您的帮助
解决方案
推荐阅读
- helidon - 如何将 TLS 证书分配给 Helidon Web 服务器?
- c++ - set::find 和 set::find 之间的性能差异
寻找 - android - 如何在 Kotlin 中解析 Room 库的注释?
- javascript - javascript计算器(我如何使第一次点击不接受操作)
- python - 在 Janusgraph 中提取数据的多线程 python 程序
- css - 如何使破折号/连字符不破坏表格中的单词
- wordpress - 使用 WP_Term_Query 获取自定义分类,但仅显示帖子中的分类
- python - 降低 Python 中从 dict 获取唯一值的复杂性
- android - 无法从 getpath() 获取实际文件路径,并且无法使用 AR Core[Android Begginer] 从本地加载 .gItf 文件
- c# - 如何使用 MSI 身份验证而不是提供客户端 ID 和客户端密钥来获取批处理服务和管理的访问令牌?