0

インターネット経由で接続する複数の winform クライアント用の小さなサーバーを作成しています。次のコードは、ローカル アドレスに設定されている場合に機能します。

サーバ:

static void Main(string[] args)
{
    TcpListener serverSocket = new TcpListener(9000);
    TcpClient clientSocket = default(TcpClient);
    int counter = 0;

    serverSocket.Start();
    Console.WriteLine("Chat Server Started ....");
    counter = 0;
    while ((true))
    {
        counter += 1;
        clientSocket = serverSocket.AcceptTcpClient();

        byte[] bytesFrom = new byte[10025];
        string dataFromClient = null;

        NetworkStream networkStream = clientSocket.GetStream();
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

        clientsList.Add(dataFromClient, clientSocket);

        broadcast(dataFromClient + " Joined ", dataFromClient, false);

        Console.WriteLine(dataFromClient + " Joined chat room ");
        handleClinet client = new handleClinet();
        client.startClient(clientSocket, dataFromClient, clientsList);
    }

    clientSocket.Close();
    serverSocket.Stop();
    Console.WriteLine("exit");
    Console.ReadLine();
}

Winform クライアント:

public partial class Form1 : Form
{
    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
    NetworkStream serverStream = default(NetworkStream);
    string readData = null;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        readData = "Conected to Chat Server ...";
        msg();
        clientSocket.Connect("127.0.0.1", 9000);
        serverStream = clientSocket.GetStream();

        byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox3.Text + "$");
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();

        Thread ctThread = new Thread(getMessage);
        ctThread.Start();
    }
}

これらのコードは、ネットワークを介して互いに通信すると正常に機能します。しかし、このコード行を変更することにしたとき

clientSocket.Connect("127.0.0.1", 9000);clientSocket.Connect("81.62.126.41", 9000);

私のIPアドレスでは、次のSocketExceptionが発生します。

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

だから私が試したいくつかのこと。ルーターの背後にいるため、ポート転送ポートは 9000 です。ポート 9000 のインバウンドおよびアウトバウンド ルールを作成します。そして、サーバーが実行されている間にhttp://www.canyouseeme.org/にアクセスしましたが、Web サイトは実際に私のサービスを見ることができます。

この問題を解決するために何ができるか知っている人はいますか?

これは、サーバーが実行されているときの netstat の写真です。役に立つかもしれないと思った。 ここに画像の説明を入力

4

1 に答える 1

0

同様の問題がありました。

  1. コード内の文字列を 1 つだけ変更して機能しなくなった場合は、使用しているツールを再確認してください。一部の内部プロキシは、内部 (127.0.0.1) または外部 IP との通信を許可/禁止する可能性があります。
  2. ブラウザで同じ URL 127.0.0.1:9000 と 81.62.126.41:9000 を確認します。2番目のケースで開かない場合は、コードではなく、ファイアウォールで発行するか、サーバーを外部アクセスできるように設定してください。
  3. 例外は、サーバーに問題があることを意味します。開いhttp://81.62.12.32/て開いhttp://81.62.126.41:9000/てみると、2 つの異なるエラーが表示されます。

結論: 問題はコードにありません。これは、Web サーバーの設定またはファイアウォールの設定にあります。

于 2013-11-14T17:32:09.700 に答える