使用套接字从机器接收数据
Receiving Data from Machine using Socket
我是套接字编程的新手。
我正在使用以下代码接收来自病理机器的传入数据。
byte[] buffer = new byte[2048];
IPAddress ipAddress = IPAddress.Parse(SERVER_IP);
IPEndPoint localEndpoint = new IPEndPoint(ipAddress, PORT_NO);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sock.Connect(localEndpoint);
}
catch (Exception ex)
{
throw ex;
}
int recv = 0;
string Printed = string.Empty;
StringBuilder sb = new StringBuilder();
while ((recv = sock.Receive(buffer)) > 0)
{
if (sock.Receive(buffer).ToString().Length > 1) // I used this line because it's receiving some garbage value all the time.
{
sb.Append(Encoding.UTF8.GetString(buffer));
}
else
{
if (sb.Length > 50 && Printed == string.Empty)
{
Console.WriteLine(sb);
Printed = "Y";
}
}
}
我面临的问题
- 我的程序没有收到完整的数据。也许是因为这一行
if (sock.Receive(buffer).ToString().Length > 1)
。但我使用这条线是因为它总是收到一些东西。
- 我的程序进入死循环。我正在寻找应该在收到数据后停止一段时间并再次开始侦听新传入数据的程序。
这里有一些东西;
- 您需要存储读取计数,并使用仅那么多字节,即
var bytes = sock.Receive(buffer);
(并使用bytes
用于 EOF 测试,以及要处理的字节数)
- 我们不能在这里使用
ToString().Length > 1
,因为它是一个整数,而每个整数,作为一个字符串,都有一个非零长度;相反,简单地:if (bytes > 0)
(细节:是一个打开的套接字可以return零而不意味着EOF的场景,但是......它不适用这里)
- 即使是文本协议,你也不能必须简单地使用
Encoding.UTF8.GetString(buffer, 0, bytes)
,因为UTF8是多字节编码,意思是:你可能有部分字符;此外,您还不知道这是一条消息、半条消息还是 14 条消息;你需要阅读协议的“框架”——这可能只是意味着“缓冲字节,直到你看到一个换行符('\n'
)字符,通过编码解码那些缓冲字节,处理该消息,然后重复
我是套接字编程的新手。
我正在使用以下代码接收来自病理机器的传入数据。
byte[] buffer = new byte[2048];
IPAddress ipAddress = IPAddress.Parse(SERVER_IP);
IPEndPoint localEndpoint = new IPEndPoint(ipAddress, PORT_NO);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sock.Connect(localEndpoint);
}
catch (Exception ex)
{
throw ex;
}
int recv = 0;
string Printed = string.Empty;
StringBuilder sb = new StringBuilder();
while ((recv = sock.Receive(buffer)) > 0)
{
if (sock.Receive(buffer).ToString().Length > 1) // I used this line because it's receiving some garbage value all the time.
{
sb.Append(Encoding.UTF8.GetString(buffer));
}
else
{
if (sb.Length > 50 && Printed == string.Empty)
{
Console.WriteLine(sb);
Printed = "Y";
}
}
}
我面临的问题
- 我的程序没有收到完整的数据。也许是因为这一行
if (sock.Receive(buffer).ToString().Length > 1)
。但我使用这条线是因为它总是收到一些东西。 - 我的程序进入死循环。我正在寻找应该在收到数据后停止一段时间并再次开始侦听新传入数据的程序。
这里有一些东西;
- 您需要存储读取计数,并使用仅那么多字节,即
var bytes = sock.Receive(buffer);
(并使用bytes
用于 EOF 测试,以及要处理的字节数) - 我们不能在这里使用
ToString().Length > 1
,因为它是一个整数,而每个整数,作为一个字符串,都有一个非零长度;相反,简单地:if (bytes > 0)
(细节:是一个打开的套接字可以return零而不意味着EOF的场景,但是......它不适用这里) - 即使是文本协议,你也不能必须简单地使用
Encoding.UTF8.GetString(buffer, 0, bytes)
,因为UTF8是多字节编码,意思是:你可能有部分字符;此外,您还不知道这是一条消息、半条消息还是 14 条消息;你需要阅读协议的“框架”——这可能只是意味着“缓冲字节,直到你看到一个换行符('\n'
)字符,通过编码解码那些缓冲字节,处理该消息,然后重复