Stream TCP客户端流
我正在与电子邮件网关通信。该网关具有特定的ip和端口 网关的请求是JSON格式的,网关通常首先响应一个进行中的状态,然后响应一个确认或错误状态,也用JSON表示 发出请求和接收响应的代码为:Stream TCP客户端流,stream,tcpclient,gateway,Stream,Tcpclient,Gateway,我正在与电子邮件网关通信。该网关具有特定的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; u
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();
}
}
使用系统;
使用System.IO;
Net系统;
使用System.Net.Sockets;
使用系统文本;
使用System.Collections.Generic;
使用系统线程;
使用Microsoft.Win32;
公共类TcpClientSample
{
公共静态void发送消息(TcpClient客户端,字符串消息)
{
Console.WriteLine(“请求:+msg”);
NetworkStream=client.GetStream();
字节[]myWriteBuffer=Encoding.ASCII.GetBytes(msg);
stream.Write(myWriteBuffer,0,myWriteBuffer.Length);
byte[]myWriteBuffer2=Encoding.ASCII.GetBytes(“\r\n”);
Write(myWriteBuffer2,0,myWriteBuffer2.Length);
字符串gressponse=“”;
BinaryReader r=新的BinaryReader(流);
int receivedMessages=0;
while(true)
{
while(true)
{
char currentChar=r.ReadChar();
如果(currentChar=='\n')
打破
其他的
gResponse=gResponse+currentChar;
}
如果(gResponse!=“”)
{
Console.WriteLine(“响应:+gResponse”);
receivedMessages=receivedMessages+1;
}
if(receivedMessages==2)
{
打破
}
}
}
公共静态void Main()
{
列表消息=新列表();
对于(int i=0;i<1;i++)
{
字符串msg=“{\'用户\”:“詹姆斯\”,“电子邮件\”:”james@domain.pt\" }";
添加消息(msg);
}
TcpClient client=新的TcpClient();
client.Connect(“someIp”,somePort);
int=0;
int receivedMessages=0;
foreach(消息中的字符串msg)
{
线程newThread=新线程(()=>
{
sentMessages=sentMessages+1;
Console.WriteLine(“已发送消息:+sentMessages”);
发送消息(客户端,消息);
receivedMessages=receivedMessages+1;
Console.WriteLine(“接收到的消息:+receivedMessages”);
});
newThread.Start();
}
Console.ReadLine();
}
}
如果我发送几封电子邮件(最多10封),网络流就可以了
但如果我发上千封电子邮件,我会被谎言弄得一团糟
:{iyo“asn ooyes”“ncd”0,“súd:“4379”nme“92729”,“erúu”,“edútúi”2#púd:“921891010-11:11.725”,s“4663175D0105E6912ADAFF6FDA393367”rpy:“rcein”
为什么会这样
别担心,我不是垃圾邮件发送者:D当您将消息写入TCP套接字时,它将以发送的数据进行响应。当缓冲区已满时,我希望它为0,但您仍然会提前发送缓冲区。您应该按返回值提前发送它:)
编辑:看起来您正在使用一个流抽象来写入内部缓冲区。情况也是一样的。您说的是“消息已完全发送”“当内部缓冲区状态没有说明这一点时,即位置不等于限制。在继续之前,您需要一直发送,直到缓冲区的剩余量为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'));
...
}
谢谢你的帮助