使用a StreamWriter写入a NetworkStream和a StreamReader来读取响应.该应用程序正在发送命令并将响应读取到新闻服务器.
简化代码(无错误处理等):
tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);
networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
AutoFlush = true
};
// reads the server's response to the connect: "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
serverReader.ReadLine();
}
serverWriter.WriteLine("authinfo user username");
// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();
Run Code Online (Sandbox Code Playgroud)
代码在最后一行阻塞,可能等待网络流发送响应.
我可以通过设置超时循环来避免挂起应用程序serverReader.Peek(),但我会一直超时; …
如果 Internet 上的 B 类网络的子网掩码为 255.255.248.0,那么每个子网的最大主机数是多少?(A) 1022 (B) 1023 (C) 2046 (D) 2047
谁能告诉我如何解决这个问题的逻辑?
我有几种不同的方法连接到远程主机,发送消息,获得回复,并使用这些信息.这个工作正常,直到我在我的连接类的同一个实例中使用两个方法.在我收到错误的示例中,我运行以下方法;
public string sendRequestAccountID(string siteID)
{
//build message
String response = String.Empty;
TcpClient client = new TcpClient();
client.Connect(detailsHere);
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream);
writer.AutoFlush = false;
writer.WriteLine(sb.ToString());
writer.Flush();
StreamReader reader = new StreamReader(stream);
List<XmlNode> nodeList = new List<XmlNode>();
byte[] responseBytes = new byte[4096];
int bytesRead = 0;
while (true)
{
bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
if (bytesRead > 0)
{
//handle message
}
if (bytesRead == 0)
{
stream.Flush();
stream.Close();
client.Close();
string finalResponse = stuffHereToSend;
return …Run Code Online (Sandbox Code Playgroud) 客户代码:
TcpClient client = new TcpClient();
NetworkStream ns;
private void Form1_Load(object sender, EventArgs e)
{
try
{
client.Connect("127.0.0.1", 560);
ns = client.GetStream();
byte[] buffer = ReadFully(ns, client.Available);
//working with the buffer...
}
catch
{
//displaying error...
}
}
public static byte[] ReadFully(NetworkStream stream , int initialLength)
{
// If we've been passed an unhelpful initial length, just
// use 32K.
if (initialLength < 1)
{
initialLength = 32768;
}
byte[] buffer = new byte[initialLength];
long read = 0;
int chunk; …Run Code Online (Sandbox Code Playgroud) 如何清除而不处理网络流中的数据?
Dim ns As NetworkStream
Run Code Online (Sandbox Code Playgroud)
编辑:
根据James的以下评论,看来这个问题尚未得到正确回答。
我以为在做:
ns = Nothing
Run Code Online (Sandbox Code Playgroud)
会清除网络流,但是我错了。
当DataAvailable为false时,确保从NetworkStream读取所有数据吗?
或者数据的发送者是否必须首先发送数据的长度.我必须阅读,直到我读取发件人指定的字节数?
Sampel:
private Byte[] ReadStream(NetworkStream ns)
{
var bl = new List<Byte>();
var receivedBytes = new Byte[128];
while (ns.DataAvailable)
{
var bytesRead = ns.Read(receivedBytes, 0, receivedBytes.Length);
if (bytesRead == receivedBytes.Length)
bl.AddRange(receivedBytes);
else
bl.AddRange(receivedBytes.Take(bytesRead));
}
return bl.ToArray();
}
Run Code Online (Sandbox Code Playgroud) 我的服务器正在发送以下数据:
{
"command": 23
}
Run Code Online (Sandbox Code Playgroud)
我的客户收到以下数据:
"{\0\r\0\n\0 \0 \0\"\0c\0o\0m\0m\0a\0n\0d\0\"\0:\0 \02\03\0\r\0\n\0}\0"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我正在接收发送的数据,但是那些\0与之混合的数据.What is causing this?也许是编码的东西?
从服务器发送数据的方法:
public void GetBasicInfo()
{
JObject o = new JObject();
o.Add(COMMAND, (int)Command.GetBasicInfo);
byte[] package = GetBytes(o.ToString());
System.Diagnostics.Debug.WriteLine(o.ToString());
networkStream.Write(package, 0, package.Length);
networkStream.Flush();
}
private static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
Run Code Online (Sandbox Code Playgroud)
从客户端读取数据的方法:
private void CommsHandler(TcpClient tcpClient)
{
NetworkStream networkStream = tcpClient.GetStream();
while (true)
{
try
{
string message = ReadResponse(networkStream); …Run Code Online (Sandbox Code Playgroud) 我试图用C#编写一个简单的客户端/服务器应用程序.以下是发送给我的客户端的示例服务器回复:
reply {20}<entry name="test"/>
Run Code Online (Sandbox Code Playgroud)
其中{20}表示完整回复包含的字符数.在下面我写的代码中,我如何使用这个数字来循环和读取所有字符?
TcpClient tcpClient = new TcpClient(host, port);
NetworkStream networkStream = tcpClient.GetStream();
...
// Server Reply
if (networkStream.CanRead)
{
// Buffer to store the response bytes.
byte[] readBuffer = new byte[tcpClient.ReceiveBufferSize];
// String that will contain full server reply
StringBuilder fullServerReply = new StringBuilder();
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
fullServerReply.AppendFormat("{0}", Encoding.UTF8.GetString(readBuffer, 0, tcpClient.ReceiveBufferSize));
} while (networkStream.DataAvailable);
}
Run Code Online (Sandbox Code Playgroud) 我在C#中有一个简单的客户端和服务器.目标是客户端将XML文档发送到服务器,然后服务器应该使用不同的XML文档进行响应.当我尝试接收与XMLDocument.load方法(的NetworkStream)输入/请求XML服务器阻塞.
服务器:
TcpListener t = new TcpListener(IPAddress.Any, 4444);
t.Start();
TcpClient c = t.AcceptTcpClient();
NetworkStream s = c.GetStream();
XmlDocument req = new XmlDocument();
req.Load(s);
string respString = "<response><data>17</data></response>";
XmlDocument resp = new XmlDocument();
resp.LoadXml(respString);
resp.Save(s);
Run Code Online (Sandbox Code Playgroud)
客户:
TcpClient t = new TcpClient("localhost", 4444);
NetworkStream s = t.GetStream();
string reqStr = "<request><parameters><param>7</param><param>15</param></parameters></request>";
XmlDocument req = new XmlDocument();
req.LoadXml(reqStr);
req.Save(s);
XmlDocument resp = new XmlDocument();
resp.Load(s);
Console.WriteLine(resp.OuterXml);
Run Code Online (Sandbox Code Playgroud)
在将请求XmlDocument保存到流中之后,我尝试在客户端中添加Flush(),但这似乎没有帮助.最初我试过让服务器读取从客户端到MemoryStream的所有输入,但后来我发现无法向服务器表明所有输入都是在没有断开连接的情况下完成的,这意味着客户端无法阅读其输入.
我可以使用netcat从文件中将XML输入发送到服务器,一切正常.无论我在服务器中使用XmlDocument.Load(NetworkStream),还是将所有输入读入MemoryStream,这都有效.netcat在这种情况下做的是什么,我没有在我的C#客户端做什么,我怎么用C#做呢?我应该采用不同的方式吗?
我是TCP客户端和与主机通信的新手,如果这看起来是一个愚蠢的问题,敬请原谅。
我正在创建一个与设备通信的串行/ TCP应用程序。因为我已经为应用程序的串行部分编写了大多数代码,而TCP是我的新任务,所以我正在尽力使它们彼此兼容。与串行设备通信时,我使用来检索数据,.ReadLine()但是NetworkStream(我用来从主机检索数据)没有此功能。有没有办法自己实现或编写此功能?
我要做的就是从NetworkStream字节数组中检索数据,然后将其转换为ASCII,但是这种方法不适合我...
编辑:
private void Button_TCP_Connect_Click(object sender, EventArgs e)
{
try
{
Int32 port = Convert.ToInt32(TextBox_TCP_Port.Text);
String server = TextBox_TCP_Server.Text;
var IP = IPAddress.Parse(TextBox_TCP_Host.Text);
TCP = new TcpClient();
TCP.Connect(IP, port);
if (TCP.Connected)
{
TextBox_System_Log.Text = "***CONNECTED***" + Environment.NewLine + "Host: " + IP.ToString()
+ Environment.NewLine + "Port: " + port.ToString() + Environment.NewLine;
tcpConnection = true;
Stream = TCP.GetStream();
Timer_NetworkStream.Enabled = true;
Timer_NetworkStream.Start();
byte[] buffer = new byte[4096];
Stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer); …Run Code Online (Sandbox Code Playgroud) networkstream ×10
c# ×7
tcp ×4
.net ×3
tcpclient ×2
encoding ×1
networking ×1
sockets ×1
streamwriter ×1
vb.net ×1
winforms ×1
xml ×1
xmldocument ×1