处理:如何将客户端设置为单独读取一次从服务器发送的多条消息?
Processing: How do I set a client to read multiple messages sent at once from a server as separate?
我正在处理中设置一个基本的网络系统:
import processing.net.*;
Server myServer;
Client myClient;
但是,我在设置服务器和客户端通信时遇到了问题。我的客户端将所有传入消息解释为字符串,问题是每当在同一帧中从服务器发送多条消息时,它们就会添加到一个字符串中,这是我的程序无法解释的。经过测试,我发现从单个客户端向服务器发送多条消息都是一样的处理。
我的客户 reader 看起来像这样:
while (myClient.available() > 0) {
String dataIn = myClient.readString();
截至目前,我不知道问题出在 reader(组合字符串),还是我在一个帧中多次使用 write() (并且数据作为单个字符串发送)。
我想知道是否可以通过某种方式将消息 sent/read 分开,或者,如果不能,有一些方法可以测试消息是否已经发送(适用于客户端和服务器端)所以我可以设置一个队列来跟踪要发送的消息。
好吧,我决定放弃检查消息是否已发送的想法,因为我没有看到任何能够帮助做到这一点的功能。相反,我继续为名为 serverQ 的服务器创建了一个字符串数组列表,以充当要发送的消息的队列:
ArrayList <String> serverQ = new ArrayList<String>();
我还添加了一个函数 writeSQ(String),它将任何输入字符串放入队列中:
void writeSQ(String s) {
serverQ.add(s);
}
然后我开始用 writeSQ(String s) 替换 myServer.write(String) 的每个用法。在 ServerUpdate 函数的末尾,我添加了一个清空队列的部分,将下一个字符串发送给所有客户端,一次一帧:
// send data
if (serverQ.size() > 0) {
myServer.write(serverQ.get(0));
serverQ.remove(0);
}
}
但是由于某些原因,消息仍然变得复杂,所以我推测这可能是由于发送消息(每帧)的紧密度(频率)所致;所以我设置了一个布尔值 serverSent 来交替发送到每个其他帧的消息。新代码如下所示:
// send data
if (serverQ.size() > 0) {
if (!serverSent) {
myServer.write(serverQ.get(0));
serverQ.remove(0);
serverSent = true;
} else
serverSent = false;
}
这非常有效,消息由客户单独解释。我向客户端添加了完全相同的支持代码(在需要时更改从服务器到客户端的所有内容),经过大量测试后,可以确认此新支持在两种方式下都能正常工作。
我正在处理中设置一个基本的网络系统:
import processing.net.*;
Server myServer;
Client myClient;
但是,我在设置服务器和客户端通信时遇到了问题。我的客户端将所有传入消息解释为字符串,问题是每当在同一帧中从服务器发送多条消息时,它们就会添加到一个字符串中,这是我的程序无法解释的。经过测试,我发现从单个客户端向服务器发送多条消息都是一样的处理。
我的客户 reader 看起来像这样:
while (myClient.available() > 0) {
String dataIn = myClient.readString();
截至目前,我不知道问题出在 reader(组合字符串),还是我在一个帧中多次使用 write() (并且数据作为单个字符串发送)。
我想知道是否可以通过某种方式将消息 sent/read 分开,或者,如果不能,有一些方法可以测试消息是否已经发送(适用于客户端和服务器端)所以我可以设置一个队列来跟踪要发送的消息。
好吧,我决定放弃检查消息是否已发送的想法,因为我没有看到任何能够帮助做到这一点的功能。相反,我继续为名为 serverQ 的服务器创建了一个字符串数组列表,以充当要发送的消息的队列:
ArrayList <String> serverQ = new ArrayList<String>();
我还添加了一个函数 writeSQ(String),它将任何输入字符串放入队列中:
void writeSQ(String s) {
serverQ.add(s);
}
然后我开始用 writeSQ(String s) 替换 myServer.write(String) 的每个用法。在 ServerUpdate 函数的末尾,我添加了一个清空队列的部分,将下一个字符串发送给所有客户端,一次一帧:
// send data
if (serverQ.size() > 0) {
myServer.write(serverQ.get(0));
serverQ.remove(0);
}
}
但是由于某些原因,消息仍然变得复杂,所以我推测这可能是由于发送消息(每帧)的紧密度(频率)所致;所以我设置了一个布尔值 serverSent 来交替发送到每个其他帧的消息。新代码如下所示:
// send data
if (serverQ.size() > 0) {
if (!serverSent) {
myServer.write(serverQ.get(0));
serverQ.remove(0);
serverSent = true;
} else
serverSent = false;
}
这非常有效,消息由客户单独解释。我向客户端添加了完全相同的支持代码(在需要时更改从服务器到客户端的所有内容),经过大量测试后,可以确认此新支持在两种方式下都能正常工作。