C# TcpClient.Read从TcpClient.Write读取错误的值?

C# TcpClient.Read从TcpClient.Write读取错误的值?,c#,C#,您好,我想我的服务器从TcpClien中读取了错误的值。写入值应该是52(在发送时长度为字节数组),但在服务器端,当我查看TcpClient中的大小时。读取值始终为8192。我做错了什么 我的客户: using System; using System.Windows.Forms; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Net; using S

您好,我想我的服务器从TcpClien中读取了错误的值。写入值应该是52(在发送时长度为字节数组),但在服务器端,当我查看TcpClient中的大小时。读取值始终为8192。我做错了什么

我的客户:

using System;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Xml;
using System.Xml.Linq;
using System.IO;

using System.Text.RegularExpressions;
namespace client
{
    public partial class Form1 : Form
    {
        TcpClient clientSocket = new TcpClient();
        NetworkStream serverStream;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Multiline = true;
            msg("Client Started");
            label1.Text = "Client Socket Program - ";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Send();
        }

        public void msg(string mesg)
        {
            textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + mesg;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            clientSocket.Connect("192.168.1.109", 8888);

            label1.Text = "Client Socket Program - Server Connected ...";
        }
        private void Send()
        {
            NetworkStream serverStream = clientSocket.GetStream();
            XElement outXML =XElement.Load("test.xml") ;

            byte[] outStream = ConvertXmlToByteArray(outXML, Encoding.UTF8);

            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
        }
        byte[] ConvertXmlToByteArray(XElement xml, Encoding encoding)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Encoding = encoding;
                settings.OmitXmlDeclaration = true; // No prolog
                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {
                    xml.Save(writer);
                }
                return stream.ToArray();
            }
        }

    }
}
我的服务器

using System;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Xml;
using System.IO;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener serverSocket = new TcpListener(8888);
            TcpClient clientSocket = new TcpClient();
            int counter = 0;

            serverSocket.Start();
            Console.WriteLine(" >> " + "Server Started");

            counter = 0;
            while (true)
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();
                Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }

            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine(" >> " + "exit");
            Console.ReadLine();
        }
    }

    //Class to handle each client request separatly
    public class handleClinet
    {
        TcpClient clientSocket;
        string clNo;
        public void startClient(TcpClient inClientSocket, string clineNo)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }
        private void doChat()
        {
            int requestCount = 0;
            requestCount = 0;

            while ((true))
            {
                byte[] bytesFrom = new byte[(int)clientSocket.ReceiveBufferSize];
                requestCount = requestCount + 1;
                NetworkStream networkStream = clientSocket.GetStream();
                networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);

                Console.Write(clientSocket.ReceiveBufferSize.ToString());

                XElement inXML = ConvertByteArrayToXml(bytesFrom);
                inXML.Save("jest2.xml");

                //XMLSave(dataFromClient);

            }
        }
        //private void XMLSave(string inner)
        //{

        //    XmlDocument XmlDoc = new XmlDocument();
        //    XmlDoc.Load("jest.xml");
        //    XmlDeclaration xmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
        //    XmlNode nextNode = XmlDoc.CreateElement("root");
        //    nextNode.InnerText = inner;

        //    XmlDoc.DocumentElement.AppendChild(nextNode);

        //    XmlDoc.Save("jest.xml");
        //}
        XElement ConvertByteArrayToXml(byte[] data)
        {
            XmlReaderSettings settings = new XmlReaderSettings();

            using (MemoryStream stream = new MemoryStream(data))
            using (XmlReader reader = XmlReader.Create(stream, settings))
            {

                return XElement.Load(reader);
            }
        }
        private byte[] RemoveNulls(byte[] DataStream)
        {
            for (int i = 0; i < DataStream.Length - 1; i++)
            {

                if (DataStream[i] == 0x00) DataStream[i] = 0x01;
            }
            return DataStream;
        }
    }
}
使用系统;
使用系统线程;
使用System.Net.Sockets;
Net系统;
使用系统文本;
使用System.Xml;
使用System.IO;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
TcpListener serverSocket=新的TcpListener(8888);
TcpClient clientSocket=新的TcpClient();
int计数器=0;
serverSocket.Start();
Console.WriteLine(“>>”+“服务器已启动”);
计数器=0;
while(true)
{
计数器+=1;
clientSocket=serverSocket.AcceptTcpClient();
Console.WriteLine(“>>”+“客户端号:”+Convert.ToString(计数器)+“已启动!”);
handleClinet客户端=新的handleClinet();
client.startClient(clientSocket,Convert.ToString(counter));
}
clientSocket.Close();
serverSocket.Stop();
控制台写入线(“>>”+“退出”);
Console.ReadLine();
}
}
//类来分别处理每个客户端请求
公共级手持电话
{
tcpclientclientsocket;
字符串clNo;
public void startClient(TcpClient inClientSocket,字符串clineNo)
{
this.clientSocket=inClientSocket;
this.clNo=clineNo;
螺纹ctThread=新螺纹(多卡螺纹);
ctThread.Start();
}
私人电话号码()
{
int requestCount=0;
requestCount=0;
而((对))
{
byte[]bytesFrom=新字节[(int)clientSocket.ReceiveBufferSize];
requestCount=requestCount+1;
NetworkStream NetworkStream=clientSocket.GetStream();
networkStream.Read(bytesFrom,0,(int)clientSocket.ReceiveBufferSize);
Write(clientSocket.ReceiveBufferSize.ToString());
XElement inXML=ConvertByteArrayToXml(bytesFrom);
Save(“jest2.xml”);
//XMLSave(dataFromClient);
}
}
//私有void XMLSave(字符串内部)
//{
//XmlDocument XmlDoc=新的XmlDocument();
//Load(“jest.xml”);
//XmlDeclaration=XmlDoc.CreateXmlDeclaration(“1.0”,“utf-8”,null);
//XmlNode nextNode=XmlDoc.CreateElement(“根”);
//nextNode.InnerText=内部;
//XmlDoc.DocumentElement.AppendChild(nextNode);
//Save(“jest.xml”);
//}
XElement ConvertByteArrayToXml(字节[]数据)
{
XmlReaderSettings设置=新建XmlReaderSettings();
使用(内存流=新内存流(数据))
使用(XmlReader=XmlReader.Create(流、设置))
{
返回XElement.Load(读卡器);
}
}
专用字节[]RemoveNulls(字节[]数据流)
{
对于(inti=0;i
这是因为您正在丢弃有关实际读取字节数的信息,而使用缓冲区大小。您可以使用整个缓冲区,尽管它只被部分数据填充

Read
方法返回实际从流中读取的字节数

int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
Console.Write(bytesRead);
此外,您必须反复调用
Read
方法,因为它不必一次返回整个流。当流被读取到末尾时,
read
方法返回零


相关:

这是因为您正在丢弃有关实际读取字节数的信息,而使用缓冲区大小。您可以使用整个缓冲区,尽管它只被部分数据填充

Read
方法返回实际从流中读取的字节数

int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
Console.Write(bytesRead);
此外,您必须反复调用
Read
方法,因为它不必一次返回整个流。当流被读取到末尾时,
read
方法返回零


相关:

NetworkStream.Read
返回一个整数,表示读取的字节数

您好,我想我的服务器从TcpClien读取了错误的值。在我发送它的时候,它应该是52字节长的数组

不正确。TCP是基于流的协议。这意味着TCP可以随心所欲地拆分消息。它可以一次发送几个字节,将两条消息合并为一条消息,等等

因此,您必须在代码中实现某种消息检测。通常使用两种方法:

  • 引入一个包含消息的字节数的标头
  • 在邮件末尾使用分隔符

  • NetworkStream.Read
    返回一个整数,该整数表示读取的字节数

    您好,我想我的服务器从TcpClien读取了错误的值。在我发送它的时候,它应该是52字节长的数组

    不正确。TCP是基于流的协议。这意味着TCP可以随心所欲地拆分消息。它可以一次发送几个字节,将两条消息合并为一条消息,等等

    因此,您必须在代码中实现某种消息检测。通常使用两种方法:

  • 引入一个包含消息的字节数的标头
  • 在邮件末尾使用分隔符