none
StreamSocket如何发送和接收第二条信息。 RRS feed

  • 问题

  • 我用StreamSocket来写Pop3协议,代码如下

     await socket.ConnectAsync(new HostName(Pop3Sever), Sever);
                    string str = "telnet pop3.***.cn 110";
                    DataWriter writer = new DataWriter(socket.OutputStream);
                    DataReader reader = new DataReader(socket.InputStream);
                    writer.WriteString(str);
                    await writer.StoreAsync();
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    string data = reader.ReadString(reader.UnconsumedBufferLength);
                    Debug.WriteLine(data);
                    if (data.IndexOf("+OK") >= 0)
                    {
                        str="user user@***.cn";

                        writer.WriteString(str);

                       reader.InputStreamOptions = InputStreamOptions.Partial;
                       await reader.LoadAsync(1024);
                       data = reader.ReadString(reader.UnconsumedBufferLength);

                       Debug.WriteLine(data);

                    }

    }}

    结果Debug只输出第一次命令的回应+OK Hellow There 第二条命令没有回应。请问StreamSocket连续发送信息需要做什么处理吗?

    2012年8月8日 0:37

答案

  • 问题已解决。命令的格式不对,后面要加上\r\n表示命令发完了。这样服务器才知道要回复你!
    2012年8月9日 8:32
  • 检查过你的远端是否在第一个请求来之后就关闭了TCP连接?

    我这里自己写了一个Server端 ,能够接收到两次发过来的数据,并且也从server端回发了数据,也都显示成功。我并没有设计复杂的判断逻辑,只是一次发送三趟数据接收三趟:

                    int i = 0;
    
                    writer.WriteString("hello 1");
                    await writer.StoreAsync();
                    
                    DataReader reader = new DataReader(socket.InputStream);
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    string data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;
    
                    writer.WriteString("hello 2");
                    await writer.StoreAsync();
    
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;
    
                    writer.WriteString("hello 3");
                    await writer.StoreAsync();
    
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;

    都显示成功。所以是否是你的服务端关闭或者发生错误没有传送数据过来。  你做个实验,参考这篇文章写一个桌面的Server , 让其接收和发送回复给你的Metro客户端: http://www.codeproject.com/Articles/5252/Sockets-in-C 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月9日 8:51
    版主

全部回复

  • 你不是用的Listener? 而是直接从Socket中读取?

    请参考例子: http://code.msdn.microsoft.com/windowsapps/StreamSocket-Sample-8c573931 使用StreamSocketListener侦听服务和端口,然后基于Listener来接受消息。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月8日 3:50
    版主
  • 我是向一个已知的服务器发起Socket通信,等待服务器的回复。为什么要用Listener侦听呢?

    2012年8月8日 7:12
  • OK, 是这样,你的 第二次 以至后面的 都没有  await writer.StoreAsync(); 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月8日 8:58
    版主
  • 是有的,打过来的时候漏掉的。后面发现除了ConnectAsync的时候有回复+OK Hellow There,其他无论发任何消息都没有回复。

    2012年8月8日 9:05
  • 问题已解决。命令的格式不对,后面要加上\r\n表示命令发完了。这样服务器才知道要回复你!
    2012年8月9日 8:32
  • 检查过你的远端是否在第一个请求来之后就关闭了TCP连接?

    我这里自己写了一个Server端 ,能够接收到两次发过来的数据,并且也从server端回发了数据,也都显示成功。我并没有设计复杂的判断逻辑,只是一次发送三趟数据接收三趟:

                    int i = 0;
    
                    writer.WriteString("hello 1");
                    await writer.StoreAsync();
                    
                    DataReader reader = new DataReader(socket.InputStream);
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    string data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;
    
                    writer.WriteString("hello 2");
                    await writer.StoreAsync();
    
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;
    
                    writer.WriteString("hello 3");
                    await writer.StoreAsync();
    
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    data = reader.ReadString(reader.UnconsumedBufferLength);
    
                    SendOutput.Text = i++ + data;

    都显示成功。所以是否是你的服务端关闭或者发生错误没有传送数据过来。  你做个实验,参考这篇文章写一个桌面的Server , 让其接收和发送回复给你的Metro客户端: http://www.codeproject.com/Articles/5252/Sockets-in-C 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月9日 8:51
    版主
  • 额,刚回复完,就发现你自己解决了。  不错,顶一个吧 。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月9日 8:52
    版主
  • 谢谢了!今天发现是POP3的命令发送的问题。命令结尾没有加上\r\n表示结束,所以服务器没有返回消息。今天已经可以收到消息了。
    2012年8月9日 9:20