0

ユーザーがオンラインであることを確認するスレッドがあります

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
}

ユーザーが 2 回目にオンラインであるかどうかを確認するときに、警告なしでストリーム読み取りが失敗します。例外ではありません。コードはそれ以上進みません。スレッドが停止するだけで、プログラムは動作します。

スレッド全体:

        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);
        }
4

1 に答える 1

0

読み取ることができるデータがないため、 Read() ブロックのようです。詳細については、こちらを参照してください: NetworkStream.Read がハング/ブロックする理由は何ですか?

私が正しければ、その理由はサーバーがデータを送信しないことです。クライアントではなく、サーバーをデバッグしてみてください。

于 2013-04-30T20:51:23.517 に答える