【问题标题】:TCP client streamTCP 客户端流
【发布时间】:2011-05-21 20:34:47
【问题描述】:

我正在与电子邮件网关通信。该网关具有特定的 ip 和端口。

网关的请求是 JSON 格式的,网关通常首先以正在进行的状态响应,然后以确认或错误状态响应,也以 JSON 表示。

发出请求和接收响应的代码是:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Collections.Generic;
using System.Threading;

using Microsoft.Win32;

public class TcpClientSample
{
    public static void SendMessage(TcpClient client, string msg)
    {
        Console.WriteLine("REQUEST:" + msg);

        NetworkStream stream = client.GetStream();

        byte[] myWriteBuffer = Encoding.ASCII.GetBytes(msg);
        stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);

        byte[] myWriteBuffer2 = Encoding.ASCII.GetBytes("\r\n");
        stream.Write(myWriteBuffer2, 0, myWriteBuffer2.Length);

        string gResponse = "";
        BinaryReader r = new BinaryReader(stream);        

        int receivedMessages = 0;
        while (true)
        {     
            while (true)
            {
                char currentChar = r.ReadChar();
                if (currentChar == '\n')
                    break;
                else
                    gResponse = gResponse + currentChar;
            }           

            if (gResponse != "")
            {
                Console.WriteLine("RESPONSE:" + gResponse);
                receivedMessages = receivedMessages + 1;    
            }

            if (receivedMessages == 2)
            {   
                break;
            }

        }        
    }

    public static void Main()
    {
        List<string> messages = new List<string>();        

        for (int i = 0; i < 1; i++)
        {
            String msg = "{ \"user\" : \"James\", \"email\" : \"james@domain.pt\" }";
            messages.Add(msg);
        }

        TcpClient client = new TcpClient();

        client.Connect("someIp", somePort);

        int sentMessages = 0;
        int receivedMessages = 0;
        foreach (string msg in messages)
        {
            Thread newThread = new Thread(() =>
            {
                sentMessages = sentMessages + 1;
                Console.WriteLine("SENT MESSAGES: " + sentMessages);
                SendMessage(client, msg);
                receivedMessages = receivedMessages + 1;
                Console.WriteLine("RECEIVED MESSAGES: " + receivedMessages);                
            });            
            newThread.Start();

        }        

        Console.ReadLine();
    }
}

如果我发送少量电子邮件(最多 10 封),网络流就可以了。

但是,如果我发送数千封电子邮件,我会发现乱七八糟的字符谎言

:{iyo"asn ooyes" "ncd" 0,"s_d:"4379" nme" 92729,"er_u" ,"ed_t_i" 2#" p cin_d:"921891010-11:11.725,"s" 4663175D0105E6912ADAAFFF6FDA393367" rpy:"rcein"

这是为什么?

别担心,我不是垃圾邮件发送者:D

【问题讨论】:

    标签: stream tcpclient gateway


    【解决方案1】:

    当您向 TCP 套接字写入消息时,它会以发送的数据进行响应。当缓冲区已满时,我希望它为 0,但无论如何你都会提前发送缓冲区。你应该通过返回值来推进它:)

    编辑:看起来您正在使用写入内部缓冲区的流抽象。情况是一样的。当内部缓冲区状态没有这样说时,您说“消息已完全发送”,即位置不等于限制。您需要继续发送,直到缓冲区的剩余量为 0,然后才能继续。

    【讨论】:

      【解决方案2】:

      我解决了这个问题,方法是使用一个方法来从流中读取,如下所示:

      private TcpClient client;
      private NetworkStream stream;
      
      public void ListenFromGateway()
      {
         ...
         while (true)
            {
               byte[] bytes = new byte[client.ReceiveBufferSize];
      
               //BLOCKS UNTIL AT LEAST ONE BYTE IS READ
               stream.Read(bytes, 0, (int)client.ReceiveBufferSize);
      
               //RETURNS THE DATA RECEIVED 
               string returndata = Encoding.UTF8.GetString(bytes);
      
               //REMOVE THE EXCEDING CHARACTERS STARTING ON \r
               string returndata = returndata.Remove(returndata.IndexOf('\r'));
      
               ...
      }
      

      感谢您的帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 2020-03-31
        • 2010-11-18
        • 2011-08-08
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多