Я действительно путать. Я могу подключить TCPClient к серверу tcp асинхронно. В моем обратном вызове я теперь хочу начать чтение некоторых данных, но когда я иду stream = tcpClient.GetStream();
, моя программа точно не висит, она просто ничего не делает. Он не перейдет к следующей строке метода, но пользовательский интерфейс все еще работает (это Unity, возможно, он многопоточен или что-то еще).NetworkStream.GetStream() никогда не возвращается
public void SetupSocket() {
try {
tcpClient = new TcpClient(host, port);
tcpClient.BeginConnect(host, port, ConnectCallback, tcpClient);
}
catch (Exception e) {
// stuff happens
return;
}
}
private void ConnectCallback(IAsyncResult result) {
if (ConnectedToServer != null)
ConnectedToServer(this, new ServerEventArgs("Connected to server."));
Debug.Log("Where am I?"); // it does get here
try {
stream = tcpClient.GetStream();
}
catch (InvalidOperationException e){
Debug.Log(e); // no exception
}
Debug.Log("Hello?"); // never gets here
BeginReadData();
}
public void BeginReadData() {
Debug.Log(stream.CanRead); // No log here!
if (stream.CanRead) {
stream.BeginRead(tcpStateObject.buffer, 0, tcpStateObject.bufferSize, EndReadData, stream);
}
}
Я действительно потерялся в этом пункте. Я могу видеть на моем сервере, что я подключился, и когда я отключился. Я отправляю два сообщения клиенту. Он использовался для работы с синхронными сокетами, но я хотел async.
I поток не будет возвращаться до тех пор, пока не дойдет до конца, который возникает только тогда, когда соединение TCP закрывается, который я не люблю делать. Получатель должен знать, когда каждое сообщение будет завершено. При использовании TCP я обычно рекомендую завершить каждый метод, используя одну или комбинацию из следующих трех методов: 1) AScii: завершение с символом вроде \ n. 2) Ascii или Binary: добавление байтов. Count для начала каждого сообщения. 3) Ascii или Binary: использование сообщения фиксированной длины. Как и Write, это 4 байта, а Read - 7 байт. – jdweng
Я использовал «» «Я думал, что это стандарт. –
user3822370
Как я могу проверить, завершен ли поток? Я не могу работать в потоке, как только я пойду GetStream – user3822370