1

asp Web アプリケーションから tcp サーバーに接続しようとしています。私は C# でアプリケーションを使用してこれを行いましたが、Web ブラウザーから動作するかどうかを確認したいと思います。

私のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace TcpWebClient

{
    public partial class _Default : System.Web.UI.Page
{

    private byte[] data = new byte[1024];
    IPEndPoint ipep = new IPEndPoint(
            IPAddress.Parse("192.168.1.20"), 12000);

    Socket server = new Socket(AddressFamily.InterNetwork,
                   SocketType.Stream, ProtocolType.Tcp);


    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        try
        {
            server.Connect(ipep);
        }
        catch (SocketException)
        {              
        }
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        NetworkStream ns = new NetworkStream(server);

        if (ns.CanWrite)
        {
            ns.Write(Encoding.ASCII.GetBytes("DI"), 0, 2);
            ns.Flush();
        }
        else
        {
        }
        TextBox1.Text = null;
        TextBox1.Text = Encoding.ASCII.GetString(data, 0, ns.Read(data, 0, data.Length));
    }

}
}

何が機能していますか?: TCP サーバーに接続しています。しかし、いくつかのデータを送受信したいときに、エラーが発生します:

IOException was unhandled by user code and something like this: Operation is not supported on connected sockets (don't know if my translation to english is ok).

私が間違っているのは何ですか?

System.dll で、タイプ 'System.IO.IOException' の初回例外が発生しました

編集:

このようなものが機能しています..しかし、タイマーのすべてのティックでサーバーに再接続する必要があります..1つの接続を確立し、タイマーのすべてのティックが再接続せずにデータの読み取り/送信を行うことは可能ですか?

 protected void Timer1_Tick(object sender, EventArgs e)
    {

            server.Connect(ipep);
            NetworkStream stream = new NetworkStream(server);

            Byte[] data = System.Text.Encoding.ASCII.GetBytes("data");
            stream.Write(data, 0, data.Length);
            data = new Byte[256];
            Int32 bytes = stream.Read(data, 0, 8);
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
            TextBox1.Text = responseData;
            server.Close();

        }
4

1 に答える 1

0

あなたは実際に自分自身に答えました:ボタン1クリックで開くので、接続は2番目のイベントハンドラー(Button2_click)で開かれません。そして、それは、リクエストごとにインスタンスが作成されるページと一緒にライフサイクルを終了します。

開いた接続を静的変数に保存できます(接続が共有アプリケーションであることを気にしない場合は、すべてのユーザーに広く適用されます)が、編集で投稿したコードを実際に使用する必要があるかどうかはわかりません。
connectoinをアプリケーション全体で使用できるようにする場合は、その変数を静的変数として定義します(ただし、最初に使用する前に必ず初期化/接続してください)。.net4でLazy<T>提供されるヘルパークラスを使用して、接続を確認できます。は一度だけ初期化され、最初に必要になったときにのみ初期化されます。
他のクラスでも接続にアクセスできるようにする必要がある場合は、それをラップするために個別のシングルトンクラスを作成できます(同じ方法でそこで初期化できます)

于 2012-06-08T06:54:55.147 に答える