C# 套接字接收到字符串
本文关键字:字符串 套接字 | 更新日期: 2023-09-27 18:32:10
按照本指南,我编写了以下函数:
public string ConnectToHost(string ip, int port)
{
Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
IPAddress host = IPAddress.Parse(ip);
IPEndPoint ipep = new IPEndPoint(host, port);
socket.Connect(ipep);
byte[] msg = Encoding.Unicode.GetBytes("<Client Quit>");
int msgSend = socket.Send(msg);
byte[] bytes;
int byteRecieve;
String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);
while (socket.Available > 0)
{
byteRecieve = socket.Receive(bytes);
msgRecieved += Encoding.Unicode.GetString(bytes, 0, byteRecieve);
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
return msgRecieved;
}
但是我得到错误
使用未赋值的局部变量"bytes"和使用未赋值的局部变量"byteRecieve"
关于代码的谎言
String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);
从线路中删除Encoding.Unicode.GetString(bytes, 0, byteRecieve);
并且只有String msgRecieved;
给出了相同的错误,但在while
循环中。
如何让此函数以字符串形式返回收到的字节?
好吧,您确实在没有分配这些变量的情况下使用这些变量,不是吗?这是不允许的,因为不清楚这意味着什么。在这种情况下,您可以通过说以下内容来使其工作:
byte[] bytes = new byte[4096];
int byteRecieve = 0;
当你解决了那些与套接字无关的编译器错误时,你会发现使用Available
低估了传入的数据量。它几乎从来都没用。
此外,您会发现Unicode
编码字符串无法在任意边界上分解,因此这也不起作用。使用StreamReader
.
您可能应该继续寻找不同的教程。大多数都非常破碎。TCP很难正确。
看看这两行代码:
int byteRecieve;
和
String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);
在第一行中,您声明byteRecieve
,但不为其赋值。在第二行中,您可以使用它。由于您尚未为其赋值,因此会收到错误消息。
由于您在while
循环中做了正确的事情,因此您可以简单地删除上面的第二行。
也
byte [] bytes;
应该变成类似的东西
byte [] bytes = new bytes[256];
或类似。同样,您的版本仅将bytes
声明为一个字节数组,但没有为其分配/分配实际的数组值。