因此,似乎阻塞的Read()可以在接收到发送给它的所有数据之前返回.反过来,我们用一个循环来包装Read(),该循环由相关流中的DataAvailable值控制.问题是你可以在这个while循环中接收更多数据,但是没有幕后处理让系统知道这一点.我在网上找到的大多数解决方案都不适用于我.
我最后做的是作为循环的最后一步,在从流中读取每个块之后,我做了一个简单的Thread.Sleep(1).这似乎给系统提供了更新的时间,而且我没有得到准确的结果,但这对于解决方案来说似乎有点苛刻且有点"间接".
下面是我正在处理的情况列表:IIS应用程序和独立应用程序之间的单个TCP连接,都是用C#编写的,用于发送/接收通信.它发送请求然后等待响应.此请求由HTTP请求启动,但我没有从HTTP请求中读取数据这个问题,事后是这样.
以下是处理传入连接的基本代码
protected void OnClientCommunication(TcpClient oClient)
{
NetworkStream stream = oClient.GetStream();
MemoryStream msIn = new MemoryStream();
byte[] aMessage = new byte[4096];
int iBytesRead = 0;
while ( stream.DataAvailable )
{
int iRead = stream.Read(aMessage, 0, aMessage.Length);
iBytesRead += iRead;
msIn.Write(aMessage, 0, iRead);
Thread.Sleep(1);
}
MemoryStream msOut = new MemoryStream();
// .. Do some processing adding data to the msOut stream
msOut.WriteTo(stream);
stream.Flush();
oClient.Close();
}
Run Code Online (Sandbox Code Playgroud)
所有反馈都欢迎提供更好的解决方案,或者只是赞一下需要给Sleep(1)一个允许在检查DataAvailable值之前正确更新的东西.
猜猜我希望2年后这个问题的答案不是如何仍然是:)
我试图找出我在这里做错了什么.我正在尝试使用二进制读取器来简化从流中获取初始四个字节到Int32值,该值告诉我其余数据的预期时间.
static void Main(string[] args)
{
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
string s = "Imagine this is a very very long string.";
writer.Write(s.Length);
writer.Write(s);
writer.Flush();
BinaryReader reader = new BinaryReader(stream);
reader.BaseStream.Seek(0, SeekOrigin.Begin);
char[] aChars = new char[reader.ReadInt32()];
reader.Read(aChars, 0, aChars.Length);
Console.WriteLine(new string(aChars));
}
Run Code Online (Sandbox Code Playgroud)
输出应该是输入,但我得到这个(注意第一个字符从字符串更改为字符串)
(想象一下,这是一个非常长的字符串
有人可以向我解释我做错了什么吗?理想情况下,第二次读取将继续,直到总读取字节数等于前四个字节的值.此代码只是一个简化,以显示我遇到的问题.流的位置似乎是正确的(4)但它几乎看起来像是从2开始读取.
这个代码在哪里工作很简单的问题?
static void *gostruct[] =
{
[0 ... 255] = &&l_bad,
['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop,
['"'] = &&l_qup,
[':'] = &&l_loop,[','] = &&l_loop,
['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy
['{'] = &&l_up, ['}'] = &&l_down,
['-'] = &&l_bare, [48 ... 57] = &&l_bare, // 0-9
['t'] = &&l_bare, ['f'] = &&l_bare, ['n'] = &&l_bare // …Run Code Online (Sandbox Code Playgroud) Android 3.1+支持操纵杆和游戏手柄,但没有任何示例.我试图使用onTrackballEvent但它没有用.如何在Android应用程序中使用操纵杆?
所以我使用的是Selenium和Python 2.7的组合(如果重要的话,我所使用的浏览器是Firefox).我是XPath的新手,但对于获取WebElements似乎非常有用.
我有以下HTML文件,我正在解析:
<html>
<head></head>
<body>
..
<div id="childItem">
<ul>
<li class="listItem"><img/><span>text1</span></li>
<li class="listItem"><img/><span>text2</span></li>
...
<li class="listItem"><img/><span>textN</span></li>
</ul>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在我可以使用以下代码获取所有li元素的列表:
root = element.find_element_by_xpath('..')
child = root.find_element_by_id('childDiv')
list = child.find_elements_by_css_selector('div.childDiv > ul > li.listItem')
Run Code Online (Sandbox Code Playgroud)
我想知道如何在XPath语句中执行此操作.我尝试了一些法规,但最简单的是:
list = child.find_element_by_xpath('li[@class="listItem"]')
Run Code Online (Sandbox Code Playgroud)
但我总是得到错误:
selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"xpath","selector":"li[@class=\\"listItem\\"]"}';
因为我有一个解决方法(前三行)这对我来说并不重要,但我想知道我做错了什么.
c# ×2
android ×1
api ×1
arrays ×1
binaryreader ×1
c ×1
joystick ×1
memorystream ×1
python-2.7 ×1
tcpclient ×1
xpath ×1