0

メールゲートウェイと通信しています。そのゲートウェイには特定の 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:"レセイン」

どうしてこれなの?

心配しないでください、私はスパマーではありません:D

4

2 に答える 2

0

この問題は、次のようにストリームから読み取るための単一のメソッドを使用することで解決しました。

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

         ...
}

助けてくれてありがとう

于 2011-05-21T12:34:47.503 に答える
0

TCPソケットにメッセージを書き込むと、送信されたデータで応答します。バッファがいっぱいになると、0になると思いますが、とにかく送信バッファを進めます。戻り値だけ進める必要があります:)

編集:内部バッファを書き込むストリーム抽象化を使用しているようです。状況は同じです。内部バッファの状態がこれを示していない場合、つまり位置が制限に等しくない場合、「メッセージは完全に送信されました」と言っています。先に進む前に、バッファの残りの量が0になるまで送信を続ける必要があります。

于 2011-05-12T00:06:47.533 に答える