TCP-поток клиента - PullRequest
       31

TCP-поток клиента

0 голосов
/ 12 мая 2011

Я общаюсь с почтовым шлюзом. Этот шлюз имеет определенный 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" 4663175D0105E6912ADAAFFF6FDA3933 RPY: "rcein"

Почему это?

Не волнуйтесь, я не спамер: D

Ответы [ 2 ]

0 голосов
/ 21 мая 2011

Я решил эту проблему, имея единственный метод для чтения из потока, например так:

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'));

         ...
}

Спасибо за помощь

0 голосов
/ 12 мая 2011

Когда вы пишете сообщение в сокет TCP, оно отвечает отправленными данными.Когда буфер заполнен, я ожидаю, что он равен 0, но вы все равно увеличиваете свой буфер отправки.Вы должны перевести его на возвращаемое значение:)

Редактировать: похоже, вы используете потоковую абстракцию, которая записывает внутренний буфер.Ситуация такая же.Вы говорите «сообщение полностью отправлено», когда состояние внутреннего буфера не говорит об этом, то есть позиция не равна пределу.Вы должны продолжать посылать, пока оставшееся количество буфера не станет равным 0, прежде чем двигаться дальше.

...