TCP客户端流
问题描述:
我与电子邮件网关通信。该网关具有特定的IP和端口。TCP客户端流
请求网关是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\" : \"[email protected]\" }";
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个)网络流正常。
但是,如果我发邮件的数千我搞的一团糟字符骗
:{伊予 “ASN ooyes” “名片” 0 “S_D:” 4379" NME” 92729 “er_u”, “ed_t_i” 2 # “p cin_d: ”921891010-11:11.725,“ S” 4663175D0105E6912ADAAFFF6FDA393367" RPY: “rcein”
这是为什么
不要担心,我不是垃圾邮件发送者:d
答
我具有一个单一的方法解决了这个问题,只是从流中这样写着:
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'));
...
}
感谢您的帮助
答
当你写一个消息给TCP套接字时,它会以发送的数据做出响应。当缓冲区满时,我期望它是0,但是你提前发送无论如何缓冲。你应该通过返回值来提高它:)
编辑:它看起来像你正在使用流抽象写入内部缓冲区。情况是一样的。当内部缓冲区状态不是说这个,即位置不等于限制时,你说“消息已经完全发送”。在继续之前,您需要继续发送,直到缓冲区的剩余量为0。