麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

基于UDP、TCP協議的C#網絡編程

2023-05-12 12:29:37
字體:
來源:轉載
供稿:網友

與UDP不同,基于TCP協議的編程的服務器端有一個監聽對象:TcpListener,它負責監聽來自客戶端的消息并處理,并且必須在保持連接的情況下與客戶端保持互動,下面舉個例子來說明這個問題。

 示例一:基于TCP協議的網絡編程

窗體:

  Form2做為本程序的服務器端,當按下Start后,啟動服務,剩下的是一個Form1,我啟動了兩次,都連接到Form2,當在Form1的Send欄里寫入小寫字母并按下Send按鈕后,將該字符串發送至Form2,同時Form2將該字符串轉換為大寫,返回給發送者,說明完畢,出個謎語,誰知道兩個Form1里字母是啥意思?

       Form2:(服務器端)

public partial class Form2 : Form
    {

        //聲明監聽對象
        private TcpListener tl;

        //聲明網絡流
        private NetworkStream ns;
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();           
        }

        private void btnStart_Click(object sender, EventArgs e)
        {

            //開啟8888端口的監聽
            tl = new TcpListener(8888);
            tl.Start();

            //開啟線程
            Thread th = new Thread(new ThreadStart(listen));
            th.IsBackground = true;
            th.Start();
        }
        private void listen()
                 
            while (true)
             

                //獲得響應的Socket
                Socket sock = tl.AcceptSocket();  

                //通過該Socket實例化網絡流           
                ns = new NetworkStream(sock);

                //ClientTcp是添加的類,下面會做說明
                ClientTcp ct = new ClientTcp(ns);

                //ct_MyEvent方法注冊ClientTcp類的MyEvent事件
                ct.MyEvent += new MyDelegate(ct_MyEvent);

                //開啟線程
                Thread th = new Thread(new ThreadStart(ct.TcpThread));
                th.IsBackground = true;
                th.Start();
            }
        }

        void ct_MyEvent(string temp)
        {

            //設置服務器端TextBox的值
            this.textBox1.Text = temp;
        }
    }

 

       Form1:(客戶端)

 

public partial class Form1 : Form
    {

        //聲明Tcp客戶端
        private TcpClient tc;

        //聲明網絡流
        private NetworkStream ns;
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {

            //注冊本機8888端口
            tc = new TcpClient("localhost",8888);

            //實例化網絡流對象
            ns = tc.GetStream();
            string temp = this.textBox1.Text;

            StreamWriter sw = new StreamWriter(ns);
            StreamReader sr = new StreamReader(ns);

            //將TextBox1的值傳給服務器端
            sw.WriteLine(temp);
            sw.Flush();

            //接收服務器端回傳的字符串
            string str = sr.ReadLine();
            this.textBox2.Text = str;
            sr.Close();
            sw.Close();
        }
    }

 

       ClientTcp類:

    //聲明一個需要一個字符串參數的委托

    public delegate void MyDelegate(string temp);
    class ClientTcp
    {

        //設置網絡流局部對象
        private NetworkStream ns;

        //聲明類型為MyDelegate的事件MyEvent
        public event MyDelegate MyEvent;

        //構造函數中接收參數以初始化
        public ClientTcp(NetworkStream ns)
        {
            this.ns = ns;
        }

        //服務器端線程所調用的方法
        public void TcpThread()
        {

            //獲得相關的封裝流
            StreamReader sr = new StreamReader(ns);
            string temp = sr.ReadLine();

            //接收到客戶端消息后觸發事件將消息回傳
            MyEvent(temp);
            StreamWriter sw = new StreamWriter(ns);

            //轉換為大寫后發送消息給客戶端
            sw.WriteLine(temp.ToUpper());
            sw.Flush();
            sw.Close();
            sr.Close();
        }
    }

這里說下為什么需要ClientTcp這么個類,說這個之前,先說一下為什么服務器端需要開啟一個新的線程來監控端口,這個原因比較簡單,Socket sock = tl.AcceptSocket();  這個方法會造成阻塞,也就是說如果沒有得到客戶端的響應,TcpListenr將一直監聽下去,這就會造成程序的假死,因此我們需要單獨開一個線程來監聽我們的8888端口,我們觀察服務器端(Form2)可以看出,NetworkStream是一個全局變量(實際上局部與全局都是一樣),如果CPU忙的過來,直接把ClientTcp里的方法拿到Form2里寫沒問題,但是一旦客戶端過多造成數據擁擠,那很可能當運算還未結束,NetworkStream就已經換人了,因此當我們取得某客戶端對應的NetworkStream后,應該考慮立刻將它封裝到一個類中,再在該類中再對該NetworkStream做相應的操作,ClientTcp這個類就是為這個設計的,而當封裝了NetworkStream后,我們發現從客戶端傳過來的值是我們需要的,因此就用到了事件的回調,這個我前面有篇文章里講過了,見http://blog.sina.com.cn/u/4c459776010008ws,基于TCP協議的網絡編程基礎的東西就這些,寫法很固定,但是需要很多的技巧,前幾天試著寫一個聊天室程序,差點沒吐血,果然不是一般的麻煩。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产艳妇av视国产精选av一区 | 欧洲黄视频 | 久久亚洲精品久久国产一区二区 | 天天夜碰日日摸日日澡性色av | 久久男人的天堂 | 久久精品欧美视频 | 草逼一区 | 亚洲乱码精品久久久久 | 在线中文字幕不卡 | 欧美精品18videos性欧美 | 羞羞视频免费网站含羞草 | 激情五月少妇a | 99精品国产一区二区三区 | 黄色毛片免费看 | 91精品国产91久久久久久丝袜 | 精品一区二区在线观看 | 成人福利视频在线 | 毛片免费试看 | 九一免费国产 | 毛片在线视频免费观看 | 极色品影院 | 蜜桃一本色道久久综合亚洲精品冫 | 亚洲综合视频网 | 蜜桃传媒视频麻豆第一区免费观看 | 亚洲男人的天堂在线视频 | 欧美性受xxxx白人性爽 | 日本在线视频二区 | 理论片中文字幕 | 国产精品久久久久久婷婷天堂 | 91久久国产综合久久91精品网站 | a视频在线免费观看 | 狠狠干五月天 | 九九精品影院 | 男人天堂免费 | 九九色在线观看 | 精品国产一区三区| 免费午夜视频在线观看 | 青草久久久久 | 九九热精品在线 | 日本精品中文字幕 | 91成人免费版 |