C#はTCP通信を実現します--- VSを使用したWindowsフォームアプリケーション

1.UIインターフェース設定

ここに写真の説明を挿入
1. Click()イベントを使用した3つのボタンコントロール。
2. 3つのGroupBoxコントロールは、サーバーなどの特定の領域に文字を表示できます。
3. 2つのRichTextBoxコントロールを使用して、入力データと受信データを表示します。
4.データ処理を受信するために使用されるタイマーコントロール

次に、サーバー実装コード

1.関連変数

//定义的类内变量
        private TcpListener Listener;
        private Socket SocketClient;
        private NetworkStream NetStream;
        private StreamReader ServerReader;
        private StreamWriter ServerWriter;
        private Thread Thread;

2.コアコード

2.1スレッド機能の実行

public void TCPListener()
{
   //在这里填入你的ip地址
   this.Listener = new TcpListener(IPAddress.Parse("192.168.31.62"), 8000);
   Listener.Start();
   button1.Enabled = false;
   this.Text = "服务器正在运行中。。。";
   while (true)
   {
       try
       {
           SocketClient = Listener.AcceptSocket();         //等待客户端的socket
           NetStream = new NetworkStream(SocketClient);    //有客户端连接成功后,创建网络流
           ServerReader = new StreamReader(NetStream);     //读数据
           ServerWriter = new StreamWriter(NetStream);     //写数据
           
       }
       catch
       {

       }
   }
}

 この関数はスレッドの実行関数であり、クライアントのソケット接続を常に待機してデータを受信します。
 この関数は、ボタンが押された後に新しいスレッドを割り当て、ボタンが押された後にロックされます。つまり、サーバーは1つのスレッドを実行するだけでよく、クライアントはサーバーに接続するために複数のスレッドを実行できます。

2.2受信機能

public void GetMessage()
{
     //网络流不为空并且有可用数据
     if (NetStream != null && NetStream.DataAvailable)
     {
         richTextBox1.AppendText(DateTime.Now.ToString());//显示时间
         richTextBox1.AppendText("  客户端说:\n");
         richTextBox1.AppendText(ServerReader.ReadLine() + "\n");
         //设置下拉框
         richTextBox1.SelectionStart = richTextBox1.Text.Length;
         richTextBox1.Focus();
         richTextBox2.Focus();
     }
 }

 この関数は、タイマーの割り込みトリガー関数で実行され、ネットワークストリームにデータがある場合、受信ボックスコントロールに出力します。

3.キートリガー機能

3.1サーバーに接続する

private void button1_Click(object sender, EventArgs e)
{
    this.Thread = new Thread(new ThreadStart(TCPListener));
    this.Thread.Start();
}

 スレッドを開始し、スレッド実行関数をTCPListener()に設定します。特定の関数は、2.1にあります。

3.2データの送信

private void button3_Click(object sender, EventArgs e)
{
    try
    {
        if (richTextBox2.Text.Trim() != "")
        {
            //信息写入流
            ServerWriter.WriteLine(richTextBox2.Text);
            ServerWriter.Flush();
            //显示在文本框上。
            richTextBox1.AppendText(DateTime.Now.ToString());
            richTextBox1.AppendText("  服务器说:\n");
            richTextBox1.AppendText(richTextBox2.Text + "\n");
            richTextBox2.Clear();
            //滚动条
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.Focus();
            richTextBox2.Focus();
        }
        else
        {
            MessageBox.Show("信息不能为空!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            richTextBox2.Focus();
            return;
        }
    }
    catch
    {
        MessageBox.Show("客户端连接失败……", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
}

 ユーザーが[送信]をクリックすると、テキストボックスに入力され、メッセージ受信ボックスに表示されたデータに従ってクライアントに送信されます。

3.3クリアデータ

private void button2_Click(object sender, EventArgs e)
{
     richTextBox1.Clear();
 }

 受信ボックスのデータをクリアします。

4.その他のモジュール

4.1コンストラクター

public Form1()
 {
     InitializeComponent();
     CheckForIllegalCrossThreadCalls = false;
 }

4.2フォーム関連のイベント

private void Form1_Load(object sender, EventArgs e)
 {
     this.richTextBox1.ReadOnly = true;  //只读
     this.timer1.Enabled = true;         //定时器使能
 }

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     DialogResult dr = MessageBox.Show("关闭服务器将无法接收到来自客户端的数据,你确定要关闭吗?", "服务器信息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
     if (dr == DialogResult.Yes)
     {
         Listener.Stop();
         this.Thread.Abort();
         e.Cancel = false;
     }
     else
     {
         e.Cancel = true;
     }
 }

 フォームのイベント機能では、いくつかの初期化操作を実行し、フォームを閉じるときにソケットとスレッドを閉じることができます。そうしないと、異常なエラーが発生します。
詳しくは私のブログをチェックしてみてください

4.3タイマーイベント

private void timer1_Tick(object sender, EventArgs e)
{
     //接收数据,处理数据
     GetMessage();
 }

 データ受信関数GetMessage()を呼び出して、受信データを継続的に処理します。

第三に、クライアント実装コード

1.説明する

 クライアントコードの実装はサーバーに似ていますが、サーバーに接続するためにIPとポートを選択する必要があります。
** PS:サーバーとクライアントのコードは同じLANで実行されます。つまり、同じルーターまたはホットスポットを使用し、ipconfigを使用してコンソールにIPを表示し、関連する場所を入力します。

2.コアコード

public void GetConn()
{
    CheckForIllegalCrossThreadCalls = false;
    while (true)
    {
        try
        {
            TcpClient = new TcpClient(textBox1.Text.Trim(), Convert.ToInt32(textBox2.Text.Trim()));
            Stream = TcpClient.GetStream();
            //创建读写流
            ClientReader = new StreamReader(Stream);
            ClientWriter = new StreamWriter(Stream);
            textBox1.Enabled = false;
            button1.Enabled = false;
            this.Text = "客户端   " + "与" + textBox1.Text.Trim() + "连接成功!";
            return;
        }
        catch (Exception e)
        {
            textBox1.Enabled = true;
            button1.Enabled = true;
            MessageBox.Show(e.ToString());
            return;
            //MessageBox.Show("连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

 この関数は、TcpClientクラスを使用したクライアントのスレッド実行関数です。
 残りはサーバーとほぼ同じです。サーバーを理解した後、クライアントの作成は実際には画像を検索する過程にあります。
 それでもわからない場合は、ここをクリックしてください。アップロードしたリソースとプロジェクト全体を以下に示します。

皆さんが幸せに学べることを願っています!

おすすめ

転載: blog.csdn.net/aruewds/article/details/109262823