0

私はネットワーキングの初心者ですが、何かを始めなければならないので、Visual Studio 2010 で C# 言語 (winform) を使用してチャット アプリを作成することにしました。

私はそれについて多くのことをグーグルで検索し、必要なものをほぼ正確に見つけました. 次のコード サンプルを見つけました (C# - コンソール):

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx

TCP プロトコルを使用してそのアプリケーションを作成したい (もっと簡単な方法があるかどうかはわかりませんが、C# でそのチャットを作成しようとしたときに TCP の基本を理解しました。

上記のリンクのコード サンプルを実行すると、機能しました。そこで、これらのサンプルをチャット アプリケーションに適応させようとしました。

私のチャット アプリケーションは、実際にはサーバーとクライアントの 2 つのアプリで構成されています。どちらも同じ GUI (2 つのテキスト ボックス、1 つのボタン、およびクライアントがサーバーに接続されているかどうかを表示するための 2 つのラベル) を備えています。

サーバー/クライアント アプリの textBox1 は、クライアント/サーバー アプリから送信されたメッセージを表示するものです。サーバー/クライアント アプリの textBox2 で、ユーザーはメッセージを入力し、ボタンを押してメッセージをクライアント/サーバー アプリに送信します。

これまでに試したことをお見せしましょう。これはサーバー アプリケーション コードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;


namespace Server_TCP_WINFORMS
{
    public partial class Form1 : Form
    {
    //Int32 port = 13000;
    IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
    public Form1()
    {
        InitializeComponent();
        server.Start();
    }

    byte[] bytes = new byte[256];
    String data = null;
    TcpClient client = new TcpClient();


    bool sw = true;
    int data_at_byte_level = 0;

    private void Form1_Load(object sender, EventArgs e)
    {

        try
        {


                label2.Text = "Waiting for an incoming connection...";
                if (!server.Pending())
                {
                    label2.Text = "For moment, there are no connections requests!";
                }
                else
                {

                    client = server.AcceptTcpClient();
                    label2.Text = "Connected!";
                    sw = false;
                }



        }
        catch (SocketException xyz)
        {
            MessageBox.Show("Exception occured!");
        }
        if (sw == false)
        {
            NetworkStream stream = client.GetStream();
            while ((data_at_byte_level = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                data = System.Text.Encoding.ASCII.GetString(bytes);
                textBox1.Text += data;
                data = null;
                bytes = null;

            }

        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        String dataT;
        if (textBox2.Text!=null && sw == false)
        {
            NetworkStream stream = client.GetStream();
            dataT = textBox2.Text;
            byte[] msg = System.Text.Encoding.ASCII.GetBytes(dataT);
            stream.Write(msg, 0, msg.Length);
        }
    }


}

}

そして、これはクライアント アプリケーション コードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace Client_TCP_WINFORMS
{
  public partial class Form1 : Form
  {
     TcpClient client = new TcpClient("127.0.0.1", 13000); 

    public Form1()
    {
        InitializeComponent();
        label2.Text = "Conected to the server!";

    }

    private void button1_Click(object sender, EventArgs e)
    {
        NetworkStream stream = client.GetStream();
        if (textBox2.Text != null)
        {
            String data_str = textBox2.Text;
            Byte[] data_byte = System.Text.Encoding.ASCII.GetBytes(data_str);
            stream.Write(data_byte, 0, data_byte.Length);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Byte[] data_byte = new Byte[290];
        int bytes;
        string Data;
        NetworkStream stream = client.GetStream();
        bytes = stream.Read(data_byte, 0, data_byte.Length);
        Data = System.Text.Encoding.ASCII.GetString(data_byte, 0, bytes);
        textBox1.Text += Data;

    }
}
}

これら 2 つのアプリが次のように動作するようにします。サーバー アプリケーションを起動してから、クライアント アプリケーションを起動します。両方が開いているときは、すでに接続されている必要があります(その方が簡単だと思います)。

次に、サーバーが(たとえば)クライアントにメッセージを送信するときに、クライアントがメッセージを受信して​​表示する必要があることを意味します。サーバーが別のメッセージを送信した場合、クライアントもそれを受信して​​表示する必要があります。ユーザー (クライアントまたはサーバーのユーザー) が送信ボタンを押すと、アプリケーションは textBox2 から他のアプリケーションにメッセージを送信する必要があります。Windowsフォームでこれらのことを行うにはどうすればよいですか?

コンソールのコード サンプルを見ると、サーバーがクライアントからメッセージを読み取るメイン ループがあることがわかります。しかし、サーバーもメッセージを送信したい場合はどうなるでしょうか? 送信ボタンが押された場合、button_pressed のイベントが発生してメッセージを送信しますが、メッセージの送信が完了すると、メイン ループに戻りますか?

私の英語を許してください。私はネイティブスピーカーではありません。

心より感謝申し上げます。

4

1 に答える 1