C#读取字节[]并清除垃圾数据

C#读取字节[]并清除垃圾数据,c#,sockets,C#,Sockets,在stackoverflow上找不到这个,我确实有一个我几个月前写的例子,但现在也找不到 基本上,我将字节[]从客户端发送到服务器,在服务器窗口中显示它,然后计划对其中的数据执行操作。但是,我收到的数据并不是每次都被清理,例如: 我发送“ABCDEF” 服务器显示“ABCDEF” 我发送“GHI” 服务器显示“GHIDEF” 我想你可以看到我来自哪里,我只需要一个清理byte[]数组的方法,这方面的事情 接下来的步骤是只读取我打算使用的字节,所以在这一分钟,虽然我只使用了X个数据量,但实际上我接

在stackoverflow上找不到这个,我确实有一个我几个月前写的例子,但现在也找不到

基本上,我将字节[]从客户端发送到服务器,在服务器窗口中显示它,然后计划对其中的数据执行操作。但是,我收到的数据并不是每次都被清理,例如:

我发送“ABCDEF” 服务器显示“ABCDEF” 我发送“GHI” 服务器显示“GHIDEF”

我想你可以看到我来自哪里,我只需要一个清理byte[]数组的方法,这方面的事情

接下来的步骤是只读取我打算使用的字节,所以在这一分钟,虽然我只使用了X个数据量,但实际上我接收到的数据比我需要的多得多,现在我需要在最后处理额外的数据

有人能告诉我怎么做吗

我的代码如下

客户:

    static void Main(string[] args)
    {

        try
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            Console.WriteLine("Welcome to Josh's humble server.");
            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 2000);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            sock.Bind(ipEnd);
            sock.Listen(100);
            Socket clientSock = sock.Accept();
            byte[] mabytes = encoding.GetBytes("Test");
            clientSock.Send(mabytes);
            Console.WriteLine("Hmmm, data sent!");
            Console.ReadLine();
            Console.WriteLine(encoding.GetString(mabytes));
            Console.ReadLine();
            byte[] buffer = encoding.GetBytes("server message");
            while (true)
            {
                clientSock.Receive(buffer);
                Console.WriteLine(encoding.GetString(buffer));
            }


        }
        catch (Exception ex)
        {
            Console.WriteLine(Convert.ToString(ex));
            Console.ReadLine();
        }

    }
服务器:

    static void Main(string[] args)
    {
        ASCIIEncoding encoding = new ASCIIEncoding();
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        Console.WriteLine("Welcome to Josh's humble client.");
        Console.ReadLine();
        IPEndPoint ipEnd = new IPEndPoint(ip, 2000);
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        sock.Connect(ipEnd);
        while (true)
        {
            Console.WriteLine("Please enter a message:\n");
            byte[] mabyte = encoding.GetBytes(Console.ReadLine());
            sock.Send(mabyte);
            Console.WriteLine("Sent Data");
        }
    }

提前感谢

您使用
clientSock.Receive(缓冲区)
获取数据,但从不检查返回值。它的读取长度可能小于缓冲区的长度。更正确的方法可以是:

int len = clientSock.Receive(buffer);
Console.WriteLine(encoding.GetString(buffer,0,len));
还使用
byte[]buffer=encoding.GetBytes(“服务器消息”)分配字节不是一个好方法。
使用类似于
byte[]buffer=newbyte[1024*N]的内容

--编辑--

当在连续读取之间拆分多字节字符时,即使这种方法也会出现问题。
更好的方法是使用TcpClient,通过
newstreamreader(TcpClient.GetStream())
包装它的流,并逐行读取

我相信您的客户端和服务器代码块是反向的。请进行相应的编辑以避免混淆。要对此进行扩展,read Receive的返回值是读取的长度。谢谢,我现在已经清理了缓冲区(为while语句的每次运行声明了一个新的缓冲区)并将长度选项添加到getstring中,您能告诉我0的含义吗,虽然我知道它是byteIndex,这是指实际数据的开始还是什么?不,每次从
0
索引开始,缓冲区都会被填满。编码将使用
count
字节从
byteindex
(在您的例子中是
0
)形成一个字符串。@user1813394您不需要清理缓冲区。当您收到新消息时,它将从第一个字节开始并在缓冲区中运行,直到缓冲区已满或达到长度
len
将告诉您当前哪些索引有值。根据缓冲区大小和您收到的邮件数量,清理缓冲区可能会导致明显的性能下降。非常感谢您的帮助!:)