我有Unity app作为套接字服务器:
public class Server : MonoBehaviour
{
private String outData;
private String inData;
public void writeData(String data){
outData = data;
}
void Start()
{
ThreadStart ts = new ThreadStart(dataHandler);
mThread = new Thread(ts);
mThread.Start();
}
void dataHandler()
{
TcpListener listener = new TcpListener(PORT);
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
new Thread(() =>
{
using (client)
{
var reader = new StreamReader(client.GetStream());
var writer = new StreamWriter(client.GetStream());
while (true)
{
inData = reader.ReadLine();
if(outData != null){
writer.WriteLine(outData);
writer.Flush();
outData = null;
}
}
}
}).Start();
}
}
}
我不熟悉.NET线程,也无法弄清楚如何发送数据。当数据出现时,套接字线程唤醒并且inData字段更新。但是当我调用writeData时没有任何反应。套接字线程继续睡眠,直到inData更新。
答案 0 :(得分:1)
但是当我调用writeData时没有任何反应。套接字线程继续睡眠,直到inData更新。
那是因为你的帖子在inData = reader.ReadLine();
上被阻止了。它将一直坐在那里直到它接收数据(或抛出异常)。只有这样它才能真正检查传出数据并发送它。
读取数据应该保留在一个单独的线程中,但不需要在线程中发送数据。发送数据不是阻止呼叫。您的数据将被推送到某个本地缓冲区,并且在将来的某个时刻,操作系统将负责其余的工作。您的写入方法应该更像:
public void writeData(String data)
{
foreach(StreamWriter clientWriter in ClientWriters)
{
clientWriter.WriteLine(outData);
clientWriter.Flush();
}
}
ClientWriters是一个应该在connect / disconnect上维护的List。还有其他方法可以编写此方法,但基本上,您需要立即发送传出数据。