小编Jam*_*mes的帖子

TcpClient.GetStream().DataAvailable返回false,但stream有更多数据

因此,似乎阻塞的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年后这个问题的答案不是如何仍然是:)

c# networkstream tcpclient

10
推荐指数
2
解决办法
2万
查看次数

C#BinaryReader.Read()以垃圾开头

我试图找出我在这里做错了什么.我正在尝试使用二进制读取器来简化从流中获取初始四个字节到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开始读取.

c# memorystream binaryreader

6
推荐指数
1
解决办法
4148
查看次数

C数组的范围初始化

这个代码在哪里工作很简单的问题?

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)

c arrays initialization

5
推荐指数
1
解决办法
6486
查看次数

操纵杆API Android

Android 3.1+支持操纵杆和游戏手柄,但没有任何示例.我试图使用onTrackballEvent但它没有用.如何在Android应用程序中使用操纵杆?

api android joystick

4
推荐指数
1
解决办法
1万
查看次数

通过find_element_by_xpath返回<li> WebElements列表

所以我使用的是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\\"]"}';

因为我有一个解决方法(前三行)这对我来说并不重要,但我想知道我做错了什么.

xpath python-2.7 selenium-webdriver

1
推荐指数
1
解决办法
635
查看次数