- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 matlab 中运行以下客户端和服务器套接字示例代码: http://www.mathworks.com/help/instrument/using-tcpip-server-sockets.html
这是我的代码。
服务器:
t=tcpip('0.0.0.0', 9994, 'NetworkRole', 'server');
fopen(t);
data=fread(t, t.BytesAvailable, 'double');
plot(data);
客户:
data=sin(1:64);
t=tcpip('localhost', 9994, 'NetworkRole', 'client');
fopen(t);
fwrite(t, data, 'double');
事情是这样的:我运行服务器代码->程序等待来自客户端的连接->我运行客户端代码->在服务器控制台我得到:
Error using icinterface/fread (line 163)
SIZE must be greater than 0.
Error in socketTentativaMatlab (line 3)
data=fread(t, t.BytesAvailable, 'double');
我做错了什么?看起来服务器没有等待客户端发送任何东西来尝试读取数据,所以没有数据可读(它等待客户端连接思想)。
编辑1:好的,我现在发送字符,所以我们确定 t.BytesAvaiable = 元素数。
我已经能够通过以下方式成功同步接收(这是服务器代码,客户端代码是相同的但是我现在发送字符并在与服务器建立连接后暂停1秒):
t=tcpip('0.0.0.0', 30000, 'NetworkRole', 'server');
fopen(t);
data=strcat(fread(t, 1, 'uint8')');
if get(t,'BytesAvailable') > 1
data=strcat(data,fread(t, t.BytesAvailable, 'uint8')');
end
data
这是因为我怀疑 bytesAvaiable 是在尝试至少读取一次后剩余要读取的字节数……这看起来不太合乎逻辑,但显然是这样发生的。因为我必须至少读取一次才能知道消息有多少字节...我选择第一次只读取 1 个字节。然后我读剩下的东西,如果还有东西......
我可以在 matlab 进程之间完成这项工作,但我不能在 C++ 和 matlab 之间完成。 C++ 客户端成功连接到 matlab 服务器,并且可以毫无问题或错误地发送数据。但是,在 matlab 服务器端,我无法读取它。
所有这些 matlab tcpip 实现似乎都有问题!
编辑2:如果我正确地关闭客户端和服务器中的所有套接字(基本上不要让程序在打开套接字的情况下退出),上面的代码接缝可以一致地工作。我转到控制台并键入“netstat”以查看所有连接...事实证明,由于我要打开套接字,一些连接处于 FIN_WAIT_2 状态,这显然使这些连接的端口不可用。最终连接肯定会超时,但这需要一分钟或更长时间,因此,最好的做法是确保套接字始终正确关闭。
我不明白 t.BytesAvaiable 背后的逻辑是什么……它看起来并没有多大意义。如果我循环并等待它变得大于 0,它最终会发生,但这不是同步套接字应该有的方式。我的代码允许一个人同步做事,即使我不明白为什么第一次没有正确设置 t.BytesAvaiable。
最终服务器代码:
t=tcpip('0.0.0.0', 30000, 'NetworkRole', 'server');
fopen(t);
data=strcat(fread(t, 1, 'uint8'));
if get(t,'BytesAvailable') > 1
data=strcat(data,fread(t, t.BytesAvailable, 'uint8')');
end
fclose(t);
最终客户端代码:
您典型的套接字客户端,以任何语言实现,但您必须确保在连续调用 send() 方法/函数之间(或调用 connect() 和 send() 之间)至少 100 毫秒(较小的数字接缝是有风险的)被淘汰了。
最佳答案
你是对的,服务器似乎并没有在等待客户端,即使默认的通信模式是同步的。您可以自己实现等待,例如通过插入
while t.BytesAvailable == 0
pause(1)
end
在阅读之前。
但是,我发现还有更多问题——来自 MathWorks 站点的代码如此糟糕很奇怪——即 t.BytesAvailable
给出了字节数,而 fread
需要多个值,因为一个 double 值需要 8 个字节,所以它必须说
data=fread(t, floor(t.BytesAvailable / 8), 'double');
此外,如果客户端在打开连接后立即写入数据,我发现服务器会忽略它们。我能够通过在客户端代码中插入一个 pause(1)
来解决这个问题,就像这样
data=sin(1:64);
t=tcpip('localhost', 9994, 'NetworkRole', 'client');
fopen(t);
pause(1)
fwrite(t, data, 'double');
我的印象是,Matlab 实现的 TCP/IP 服务器客户端通信非常脆弱,需要大量变通方法...
关于Matlab 套接字等待响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20271970/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!