MemoryStream.Write 在客户端上有效,但在服务器上无效?

问题描述 投票:0回答:1

我对自己正在做的事情有一个非常基本的了解。因此,我正在学习有关 C# 聊天应用程序的教程,但有 2 个类完全相同;虽然代码在 ChatClient 上运行完全正常,但它甚至无法在 ChatServer 上编译。这怎么可能?

编译器说=> CS7036:没有给出与所需参数相对应的参数

说明:

  • ChatClient 用于让用户输入用户名等详细信息,然后他们可以通过聊天框 UI 聊天。
  • ChatServer 正在监听想要连接的用户,并通知是否有连接,然后提供用户之间的通信。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatClient.Net.IO
{
     class PacketBuilder
    {
        MemoryStream ms;
        public PacketBuilder()
        {
            ms = new MemoryStream();
            
        }

        public void WriteOpCode ( byte opcode )
        {
            ms.WriteByte( opcode );
        }

        public void WriteString ( string msg )
        {
            var msgLength = msg.Length;
            ms.Write(BitConverter.GetBytes(msgLength));
            ms.Write(Encoding.ASCII.GetBytes(msg)); 
        }

        public byte [] GetPacketBytes ()
        {
            return ms.ToArray();
        } 

    }
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatServer.Net.IO
{
    class PacketBuilder
    {
        MemoryStream ms;
        public PacketBuilder ()
        {
            ms = new MemoryStream();

        }

        public void WriteOpCode ( byte opcode )
        {
            ms.WriteByte( opcode );
        }

        public void WriteString ( string msg )
        {
            var msgLength = msg.Length;
            ms.Write( BitConverter.GetBytes( msgLength ) );
            ms.Write( Encoding.ASCII.GetBytes( msg ) );
        }

        public byte [] GetPacketBytes ()
        {
            return ms.ToArray();
        }

    }
}

ChatServer PacketBuilder class

我尝试看看是否有人遇到同样的问题,但找不到答案。预先感谢。

c# tcp compiler-errors memorystream
1个回答
0
投票

您必须针对比您的客户端更早的 .NET 版本构建您的

ChatServer
代码:

它成功的原因是,在.NET Core 2.1及更高版本中,添加了新的重载到

MemoryStream.Write()

MemoryStream.Write(ReadOnlySpan<Byte>) 

使用从缓冲区读取的数据将字节块写入当前流。

由于

byte []
可以隐式转换为 ReadOnlySpan<Byte>
,因此代码可以编译。

但是在

.NET Framework 中,唯一可用的重载是:

MemoryStream.Write(byte[] buffer, int offset, int count);

如您所见,

offset

count
参数是
不是可选的,因此您必须传入它们才能在.NET Framework中成功编译。 你甚至可以像这样创建一个扩展方法:

public static class MemoryStreamExtensions { public static void Write(this MemoryStream ms, byte[] buffer) { ms.Write(buffer, 0, buffer.Length); } }
现在您的代码将在两个版本中进行相同的编译,请参阅

https://dotnetfiddle.net/ZOEuNF

© www.soinside.com 2019 - 2024. All rights reserved.