【问题标题】:TcpClient Stream.Read ends thread unexpectedlyTcpClient Stream.Read 意外结束线程
【发布时间】:2013-05-01 04:51:23
【问题描述】:

我有一个线程检查用户是否在线

var user = (User)userObj;
if (!IsUserOnline(user)) return;
if (!TryToConnect(user)) return;
var TCP = user.CmdTCP;
Stream stm = TCP.GetStream();

这每次都成功完成,但就像我一样

stm.Write(GetBytes("chk"), 0, 3);

然后

var bb = new byte[1];
try {
stm.Read(bb, 0, 1);
} catch (Exception e) { /*error*/ }
if (bb[0] == CHR_SUCCESS) {
//etc etc
}

检查用户是否第二次在线时,流读取失败且没有警告。也不例外,代码不会走得更远。线程刚刚停止,程序运行。

全螺纹:

        var user = (User)userObj;
        if (!IsUserOnline(user)) return;
        if (!TryToConnect(user)) return;
        var TCP = user.CmdTCP;
        Stream stm = TCP.GetStream();
        try {
            stm.Write(GB("chk"), 0, 3);
            toLog("refresh::chk sent ;)");
        } catch (Exception e) {
            #region unable to send packet, online
            toLog("\trefresh::" + user.name + " is online (Connected, unable to send packet) " + e.Message);
            setUserStatus(user, userStatus.Online);
            return;
            #endregion
        }
        var bb = new byte[1];
        try {
            stm.Read(bb, 0, 1); //<<<<<<<<< here thread just ends, no toLog("..");, no exception
            toLog("refresh::got " + (char)bb[0]);
        } catch (Exception e) {
            #region unable to get packet, online
            toLog("\trefresh::" + user.name + " is online (Connected, unable to get packet) " + e.Message);
            setUserStatus(user, userStatus.Online);
            return;
            #endregion
        }
        if (bb[0] == CHR_SUCCESS) {
            try {
                stm.Write(GB(toStr(CHR_SSUCCESS)), 0, 1);
                toLog("refresh::CHR_SSUCCESS sent ;)");
            } catch (Exception e) {
                #region unable to send packet 2, online
                toLog("\trefresh::" user.name + " is online (Connected, unable to send packet #2) " + e.Message);
                setUserStatus(user, userStatus.Online);
                return;
                #endregion
            }
            toLog("\trefresh::" + user.name + " is online");
            setUserStatus(user, userStatus.Online);
        } else {
            for (int x = 0; x < 5; x++) {
                toLog("\t\trefresh::got wrong answer");
                System.Media.SystemSounds.Beep.Play();
                Thread.Sleep(500);
            }
            setUserStatus(user, userStatus.Online);
        }

【问题讨论】:

  • “线程刚刚停止”是指“挂起”还是“中断”?
  • 线程刚刚退出。
  • 问题中的代码只是断章取义,不是吗?你能把线程运行在一个大块中的整个代码贴出来吗? (如果不是太大,当然)
  • 如果它既不记录也不抛出异常,也许它只是挂起?我不确定,但看起来像 Read() 块?因为没有可用的数据。看这里stackoverflow.com/questions/6958255/…

标签: c# networking tcp tcpclient


【解决方案1】:

看起来像您的 Read() 块,因为没有数据可供读取。在这里查看更多信息:What are some reasons NetworkStream.Read would hang/block?

如果我是对的,原因是服务器没有发送数据。尝试调试服务器,而不是客户端。

【讨论】:

    猜你喜欢
    • 2013-12-21
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多