NetworkStream在Unity中接收一个空字符串数据



我在Unity上运行客户端代码,在主机应用程序上运行服务器代码。问题是,当服务器向客户端发送"欢迎"消息时,客户端接收到的是一个空消息。但奇怪的是,当我在Unity上以调试模式运行代码时效果很好。有人知道为什么会这样吗?

下面是客户端代码

public class Test: MonoBehaviour
{
TcpClient client;
NetworkStream networkStream;        
string stringData;
byte[] data;
private void Start()
{
StartClient();
}
private void OnApplicationQuit()
{
if (networkStream != null)
{
if (networkStream.CanRead && networkStream.CanWrite) networkStream.Close();
}
if (client.Connected) client.Close();
}
private void StartClient()
{
client = new TcpClient();
client.BeginConnect("127.0.0.1", 7777, DefaultConnectCallback, client);            
}
private void DefaultConnectCallback(IAsyncResult ar)
{
TcpClient client = (TcpClient)ar.AsyncState;
networkStream = client.GetStream();
data = new byte[1024];
networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);
stringData = System.Text.Encoding.ASCII.GetString(data).Trim('');
Log.LogMessage("Recieved a message");
Log.LogMessage(stringData);
Log.LogMessage($"{stringData.Length}");            
}
private void DefaultReadCallback(IAsyncResult ar)
{
NetworkStream networkStream = (NetworkStream)ar.AsyncState;
networkStream.EndRead(ar);
}
}

服务器代码

class Program
{        
public static Action OnExit;
static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 7);
listener.Start();   
Log.LogMessage("Server Started");
OnExit += () => 
{
foreach(var client in clients)
{
client?.GetStream()?.Close();
}
listener.Stop();
};
listener.BeginAcceptTcpClient(DefaultAcceptCallback, listener);            
Console.ReadKey();
}                
static void OnProcessExit(object sender, EventArgs e)
{                
if (OnExit != null) OnExit();    
}
static TcpClient[] clients = new TcpClient[10];
static int connection = 0;
static void DefaultAcceptCallback(IAsyncResult ar)        
{
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient newClient = listener.EndAcceptTcpClient(ar);
NetworkStream networkStream = newClient.GetStream();
byte[] welcome;
Log.LogMessage($"Connect request No.{connection} accepted");            
clients[connection] = newClient;
welcome = Encoding.ASCII.GetBytes("Welcome!");
networkStream.BeginWrite(welcome, 0, welcome.Length, DefaultReadCallback, networkStream);
Log.LogMessage($"Welcome message sent");
connection++;
listener.BeginAcceptTcpClient(DefaultAcceptCallback, listener);
}
static void DefaultWriteCallback(IAsyncResult ar)
{
NetworkStream networkStream = (NetworkStream)ar.AsyncState;
networkStream.EndWrite(ar);
}
}    
networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);

是一个非阻塞调用并立即继续编写代码。

你必须等到实际收到的东西!

private void DefaultConnectCallback(IAsyncResult ar)
{
TcpClient client = (TcpClient)ar.AsyncState;
networkStream = client.GetStream();
data = new byte[1024];
networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);
}
private void DefaultReadCallback(IAsyncResult ar)
{
NetworkStream networkStream = (NetworkStream)ar.AsyncState;
networkStream.EndRead(ar);
stringData = System.Text.Encoding.ASCII.GetString(data).Trim('');
Log.LogMessage("Recieved a message");
Log.LogMessage(stringData);
Log.LogMessage($"{stringData.Length}");            
}

参见NetworkStream.BeginReadNetworkStream.EndRead的例子

相关内容

最新更新