- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在有点不知所措。我有一些代码可以在数据可用时从套接字读取数据,但目前它在一个单独的线程上的 while 循环中,并且由于没有可用数据而在函数返回时消耗 50% 的 CPU。我真正想要的是 Sockets 的阻塞函数,它阻塞直到数据可用,或者至少是一个可以监听的 OnData 事件。我最初是从 AS3 (Flash) 转换这段代码的,但是他们的套接字类有我需要的 OnData 事件……只是用错了语言。
我目前在处理客户端连接的代码中有这段代码:
ServerThread = new Thread(() =>
{
while (server.Connected && ServerContinue)
{
ReceiveFromServer(server, client);
}
Disconnect(server, client, false);
});
ServerThread.Start();
这是 ReceiveFromServer 中的代码:
bool isReady = false;
int messageLength = 0;
int dataAvailable = 0;
UInt16 packetSize = 0;
byte[] temp = new byte[2];
do
{
dataAvailable = server.Available;
if (isReady)
{
if (dataAvailable >= messageLength)
{
byte[] temp1 = new byte[2000];
int bytesRead = server.Receive(temp1, 0, messageLength, SocketFlags.None);
byte[] data = new byte[bytesRead + 2];
Buffer.BlockCopy(temp1, 0, data, 2, messageLength);
Helpers.ByteArray tempo = data;
tempo.writeByte(temp[1]);
tempo.writeByte(temp[0]);
if (!VersionCheckPass)
{
Send(tempo, client);
return;
}
ServerPacketHandler(tempo, client);
messageLength = 0;
isReady = false;
temp = new byte[2];
}
}
else if(dataAvailable > 2)
{
server.Receive(temp, 0, 2, SocketFlags.None);
temp = temp.Reverse().ToArray();
packetSize = BitConverter.ToUInt16(temp, 0);
if (packetSize > 0)
{
messageLength = packetSize;
isReady = true;
}
}
}
while (dataAvailable > 2 && dataAvailable >= messageLength && ServerContinue);
但这里的问题是,当 dataAvailable 为 0 时,函数简单地返回,然后在线程中再次调用 RecevieFromServer。这意味着通过简单地调用 ReceiveFromServer 然后再次返回会占用大量 CPU。
我目前在 ServerThread 中的 ReceiveFromServer 之后有 Thread.Sleep(10)
但这效率很低。所以我的问题是,有没有办法阻止直到数据可用或者是否有我可以处理的事件?或者其他人是否对如何做我目前正在做的同样的事情有任何建议,但它不会在没有可用数据的情况下无休止地循环。
最佳答案
找到了一个非常简单(且明显)的解决方案来阻塞直到数据可用。调用 Socket.Receive,接收大小为 0。套接字阻塞,直到有数据要接收,然后从套接字读取 0 字节,然后解除阻塞。它真的非常了不起 :) 下面是我如何实现它的:
ServerThread = new Thread(() =>
{
byte[] zero = new byte[0];
while (Server.Connected && ServerContinue)
{
server.Receive(zero, 0, SocketFlags.None);
ReceiveFromServer(server, client);
}
Disconnect(server, client, false);
});
感谢所有的帮助。
乔希
关于c# - 套接字 OnData 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870057/
我有一个 Gridview,其适配器基于我的 MineSweeper 游戏的 Tile 类型的 pojo 列表,我正在做一些单元测试,我想做的就是单击所有没有地雷的 gridview 项目,然后长按所
我有一个 Activity 与 ListView (id: android.R.id.list)。 ListView 显示来自自定义适配器的信息,我想使用 Espresso 单击特定项目中的特定 Vi
我现在有点不知所措。我有一些代码可以在数据可用时从套接字读取数据,但目前它在一个单独的线程上的 while 循环中,并且由于没有可用数据而在函数返回时消耗 50% 的 CPU。我真正想要的是 Sock
我正在尝试验证 ListView 不包含特定项目。这是我正在使用的代码: onData(allOf(is(instanceOf(Contact.class)), is(withContactItemN
我制作了一个简单的 NodeJS TCP 服务器,Java 客户端发送图像: encodedImage = out.write("IMG;" + encodedImage); out.flush()
我正在尝试访问一个 View 的 subview 。这是我目前正在尝试开始工作的路线。 onData(withDesc("Description")).onChildView(withId(R.id.
在nodejs应用程序中,我需要生成一个子进程,并将stdio设置为“继承”模式,所以基本上: var child = spawn('some/command', [], { stdio: [pr
我一直在开发一种使用 WebRTC 在浏览器和 native 客户端之间交换音频的产品, native 端是用 C++ 实现的。目前我已经构建了 webRtc 的最新稳定版本(分支:branch-he
在使用 Facebook graph api 时,我使用 https.get 来请求 facebook 用户数据。 var optionsP = { host: 'graph.face
我在使用 http.request 发出客户端请求时遇到了一些错误( Node v0.6.18,v0.6.3),以下代码产生了错误,我有一些疑问。 var http = require('http')
我正在尝试在将 Node.js http 流发送到解析器之前对其进行编辑。我已经实现了以下代码 //catch any connection event to this server server.o
我有一个命令行 Dart 脚本客户端通过 [dart:io] websocket 与 Jetty 服务器进行交互。我已经实现了一个自定义消息子协议(protocol),它使用反射(双方)使用二进制编码
我有一个app,有ListView,我想找LinearLayout,id=order_untake_jijia_listview_jia 代码是: onData(withClassName(endsW
我是一名优秀的程序员,十分优秀!