0

私は、固有の問題であると「思われる」ものを経験しています。Windowsフォームから入力を受け取り、それを最初から作成したサーバーにプッシュするクライアント/サーバーモデルがあり、そこからWebSocket経由でWebページにプルされるはずです。

私は握手を克服し、効果的に接続を確立しています。ただし、私の onMessage メソッドはヒットすることはないようです (テキストをどれだけ早く/遅く送信しても)、理論的にはいつトリガーされるかのように見えますが、何か他のことが起こります...

サーバーに入力を送信しているクライアントからテキストを送信すると、最初の行が配信され、2 番目の行が待機されます。サーバーはこの入力を受け取り、接続されているすべての「出力」クライアントに書き込みます。これは、私の websocket を含めることを意図しています。ここで迷ってしまいます。最初の行は「書き込まれます」(サーバーによると) が、「onmessage」イベントは発生しません。サーバーに 2 行目を送信すると、書き込みを試みると、サーバーは「トランスポート接続にデータを書き込むことができません: 確立された接続がホスト マシンのソフトウェアによって中止されました」という例外をスローします。クライアントは onclose をトリガーします。

おそらく、誰かが何らかの洞察を提供することができます。ここに私のウェブソケットコードがあります:

<!DOCTYPE html>
<meta charset="utf-8" />
<html>
<head>
<script language="javascript" type="text/javascript">
  var wsUri = "ws://localhost:9001";
  var output;

  function init()
  {
    writeToScreen("Starting");
    testWebSocket();
  }

  function testWebSocket()
  {
    websocket = new WebSocket(wsUri);
    websocket.async = false;
    writeToScreen("Instantiated");
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
    writeToScreen("Evented");
    //onOpen(null);
  }

  function onOpen(evt)
  {
      try
      {
        writeToScreen("CONNECTED");
      }
      catch( e )
      {
          writeToScreen(e);
      }
  }

  function onClose(evt)
  {
    writeToScreen("DISCONNECTED");
  }

  function onMessage(evt)
  {
        try
        {
            writeToScreen("Message");
            writeToScreen("<span style=\"color: blue;\">RESPONSE: " + evt.data+"</span>");
        }
        catch( e )
        {
            writeToScreen(e);
        }
  }

  function onError(evt)
  {
    writeToScreen("<span style=\"color: red;\">ERROR:</span> " + evt.data);
  }

  function doSend(message)
  {
    writeToScreen("SENT: " + message); 
    websocket.send(message);
  }

  function writeToScreen(message)
  {
        output = document.getElementById("output");
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
  }

  window.addEventListener("load", init, false);

</script>
</head>
<body>
<div id="output">
</div>
</body>
</html>

そしてそれに対応する出力:

Starting

Instantiated

Evented

CONNECTED

DISCONNECTED

サーバーの「書き込み」メソッドは次のとおりです(私が作成し、継承しているクラスから):

public virtual void WriteLine(String Argument)
{
    if (this.ClientStream == null)
    {
        try
        {
            this.ClientStream = new NetworkStream(this.ClientSocket);
            this.WriteLine(Argument);
            return;
        }
        catch (Exception e)
        {
            throw new Exception("Exception encountered while writting to Client.\n" + e.Message);
        }
    }
    else if (this.OutputWriter == null)
    {
        try
        {
            this.OutputWriter = new StreamWriter(this.ClientStream);
            this.WriteLine(Argument);
            return;
        }
        catch (Exception e)
        {
            throw new Exception("Exception encountered while writting to Client.\n" + e.Message);
        }
    }
    else
    {
        try
        {
            this.OutputWriter.Write(Argument + "\r\n");
            this.OutputWriter.Flush();
            return;
        }
        catch (Exception e)
        {
            throw new Exception("Exception encountered while writting to Client.\n" + e.Message);
        }
    }
}

そしてサーバーの「接続」メソッド(継承されたクラスから):

public void Start()
{
    if (this.Server == null)
    {
        throw new Exception("Could not start TelnetServer.Listener, Server is null.");
    }
    else if (this.RunningThread == null)
    {
        this.RunningThread = new Thread(this.Start);
        this.RunningThread.Name = "TelnetServer.Listener:" + this.Port;
        this.RunningThread.Start();
        return;
    }
    else if (this.LocalAddress == null)
    {
        this.LocalAddress = IPAddress.Any;
        this.Start();
        return;
    }
    else if (this.NetworkListener == null)
    {
        this.NetworkListener = new TcpListener(this.LocalAddress, this.Port);
        this.NetworkListener.Start();
        this.Start();
        return;
    }
    else
    {
        this.RunningFlag = true;

        while (this.IsRunning())
        {
            try
            {
                Socket NewSocket = this.NetworkListener.AcceptSocket();
                this.Server.Connect(NewSocket);
                continue;
            }
            catch (Exception e)
            {
                this.Print("Exception encountered while creating new Client.");
                this.Print(e.Message);
                continue;
            }
        }
    }
}

さらに情報が必要な場合は、喜んで詳しく説明します。新しい接続を取得すると、「最終」クラスで完全なハンドシェイクを行い、最終クラスの「書き込み」メソッドがメッセージを上記の書き込みメソッドに送信することに注意してください。

よろしくお願いします。

[編集] 送信フレームを追加。今では最初のメッセージで確実に失敗します。if (HeaderFinished && HeaderSent) base.WriteLine("\u0000" + Encoding.UTF8.GetBytes(引数) + "\uffff"); else base.WriteLine(Argument); [/編集]

4

0 に答える 0