C# socket接收乱码

场景:

使用 Socket的方式向从服务端接收中文信息,下位机收到的中文是乱码

原因:

了解到的原因是上位机与下位机的发送与接收的编码与解码方式不一致

比如上位机采用 Encoding.UTF8.GetBytes()的方式编码发送信息

下位机采用 Encoding.Default.GetString()的方式解码的方式收信息

一个用UTF8,一个使用Default就出现了编码与解码的不一致,导致下位机收到乱码的信息。

此时改变上位机或下位机的编码、解码方式,保持两者的一致性就可解决。

解决:

方案一:将下位机的解码方式改为Encoding.UTF8.GetString()即可。

方案二:改变上位机的编码方式即可。Encoding.Default.GetBytes()

注:发送方使用GetBytes()转成byte数组发送,接收方使用GetString()装换成字符串显示。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用以下方式接收不定长数据: 1. 首先,定义一个缓冲区用于存放接收到的数据。 2. 然后,进入一个循环,每次接收一定长度的数据,将其存入缓冲区。 3. 判断接收到的数据是否满足结束标志,如果满足,则跳出循环。 4. 如果不满足,则继续接收数据,直到接收到结束标志为止。 以下是一个简单的示例代码: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class Server { // 定义结束标志 private static readonly byte[] END_FLAG = Encoding.ASCII.GetBytes("end"); public static void Main() { // 创建Socket对象 Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 绑定IP和端口号 listener.Bind(new IPEndPoint(IPAddress.Any, 8000)); // 开始监听连接 listener.Listen(1); while (true) { // 接受连接 Socket handler = listener.Accept(); Console.WriteLine($"Connected by {handler.RemoteEndPoint}"); // 定义缓冲区 byte[] buffer = new byte[1024]; byte[] data = new byte[0]; while (true) { // 每次接收1024个字节的数据 int bytesReceived = handler.Receive(buffer); // 将接收到的数据存入缓冲区 data = data.Concat(buffer.Take(bytesReceived)).ToArray(); // 判断是否接收到结束标志 if (data.Length >= END_FLAG.Length && data.Skip(data.Length - END_FLAG.Length).SequenceEqual(END_FLAG)) { break; } } // 处理接收到的数据 string message = Encoding.ASCII.GetString(data); Console.WriteLine($"Received: {message}"); // 关闭连接 handler.Shutdown(SocketShutdown.Both); handler.Close(); } } } ``` 在上面的代码中,我们定义了一个结束标志为`END_FLAG`。在每次接收数据时,我们将接收到的数据存入缓冲区`data`中。如果接收到的数据中包含结束标志,则跳出循环,否则继续接收数据。最后,我们处理接收到的数据并关闭连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值