我有一个Node.js服务器+ Unity(.NET 3.5)应用程序,可以确保通过套接字之间进行通信。从Node.js服务器到C#套接字客户端接收数据时遇到问题。
我希望C#客户端读取套接字流,直到找到换行符(/n
)。这是我确保数据从C#流向Node.js服务器的方式,因为有一个名为 split 的NPM模块,可以确保逐行读取缓冲区。
以下是我的代码,如果您能向我建议实现上述接收数据方式的解决方案,我将不胜感激:
在这里,我没有问题地连接到Node.js服务器:
private Socket ClientSocket;
private byte[] _receiveBuffer = new byte[8142];
public string hostname;
public int port;
public void onnectClient()
{
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket.Connect(hostname, port);
ClientSocket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
以下是当前的ReceiveCallback
,
private void ReceiveCallback(IAsyncResult AR)
{
int received = ClientSocket.EndReceive(AR);
byte[] recData = new byte[received];
Buffer.BlockCopy(_receiveBuffer, 0, recData, 0, received);
string resultString = System.Text.Encoding.UTF8.GetString(recData);
currentlyReceivedData = JsonUtility.FromJson<ReceivedData>(resultString);
ClientSocket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
更新1:
现在,我使用TcpClient和StreamReader代替上面的代码,但是由于某些原因,while循环不会继续:
private void ListenForData()
{
try
{
socketConnection = new TcpClient("localhost", 6670);
Byte[] bytes = new Byte[1024];
while (true)
{
using (StreamReader sr = new StreamReader(socketConnection.GetStream()))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Debug.Log("line");
}
}
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
答案 0 :(得分:2)
如果不需要使用Socket
的所有可用选项,我建议您使用TcpClient
类。建立连接后,您可以呼叫GetStream()
来接收NetworkStream
1 ,您可以将其传递给StreamReader
。
您一旦到达那里,就可以致电ReadLine()
(或道德上等价的人)来检索每行。这使您可以忽略使用“原始” TCP的许多现实情况,例如必须重建/保存缓冲区以反映它不是消息传递而是字节流的事实。
ReadLine
可以应付任何普通形式的行尾,包括\n
,\r
和\r\n
。
1 请注意,您可以从现有的Socket
中构造一个。但是我会尝试使用更简单的选项,除非我需要更复杂的选项。
答案 1 :(得分:0)
我建议您查看以下内容:https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/
那可以为您省去很多麻烦!
如果您不能使用System.IO.Pipelines,您仍然可以研究该示例如何从套接字读取直到到达新行!