亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# Socket網絡編程實例

2020-01-24 02:10:22
字體:
來源:轉載
供稿:網友

本文實例講述了C# Socket網絡編程技巧。分享給大家供大家參考。具體分析如下:

客戶端要連接服務器:首先要知道服務器的IP地址。而服務器里有很多的應用程序,每一個應用程序對應一個端口號
所以客戶端想要與服務器中的某個應用程序進行通信就必須要知道那個應用程序的所在服務器的IP地址,及應用程序所對應的端口號

TCP協議:安全穩定,一般不會發生數據丟失,但是效率低。利用TCP發生數據一般經過3次握手(所有效率低,自己百度三次握手)

UDP協議:快速,效率高,但是不穩定,容易發生數據丟失(沒有經過三次握手,不管服務器有空沒空,信息全往服務器發,所有效率搞,但服務器忙的時候就沒辦法處理你的數據,容易造成數據丟失,不穩定)

復制代碼 代碼如下:
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; 
using System.Threading; 
namespace Socket通信 

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
            this.txtPort.Text = "5000"; 
            this.txtIp.Text = "192.168.137.1"; 
        } 
        private void btnStart_Click(object sender, EventArgs e) 
        { 
            //當點擊開始監聽的時候,在服務器端創建一個負責監聽IP地址跟端口號的Socket 
            Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
            //Any:提供一個 IP 地址,指示服務器應偵聽所有網絡接口上的客戶端活動。此字段為只讀。 
            IPAddress ip = IPAddress.Any; 
            //創建端口號對象;將txtPort.Text控件的值設為服務端的端口號 
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); 
            //監聽 
            socketWatch.Bind(point); 
            ShowMsg("監聽成功"); 
            socketWatch.Listen(10);//連接隊列的最大長度 ;即:一個時間點內最大能讓幾個客戶端連接進來,超過長度就進行排隊 
            //等待客戶端連接;Accept()這個方法能接收客戶端的連接,并為新連接創建一個負責通信的Socket 
            Thread th = new Thread(Listen); //被線程執行的方法如果有參數的話,參數必須是object類型 
            Control.CheckForIllegalCrossThreadCalls = false; //因為.net不允許跨線程訪問的,所以這里取消跨線程的檢查。.net不檢查是否有跨線程訪問了,所有就不會報: “從不是創建控件“txtLog”的線程訪問它” 這個錯誤了,從而實現了跨線程訪問 
            th.IsBackground = true; //將th這個線程設為后臺線程。 
            //Start(object parameter); parameter:一個對象,包含線程執行的方法要使用的數據,即線程執行Listen方法,Listen的參數 
            th.Start(socketWatch);  //這個括號里的參數其實是Listen()方法的參數。因為Thread th = new Thread(Listen)這個括號里只能寫方法名(函數名) 但是Listen()方法是有參數的,所有就要用Start()方法將它的參數添加進來 
        } 
        /// <summary> 
        /// 等待客戶端連接,如果監控到有客戶端連接進來就創建一個與之通信的Socket 
        /// </summary> 
        /// <param name="o"></param> 
        void Listen(object o) //這里為什么不直接傳遞Socket類型的參數呢? 原因是:被線程執行的方法如果有參數的話,參數必須是object類型 
        { 
            Socket socketWatch = o as Socket; 
            while (true) //為什么這里要有個while循環?因為當一個人連接進來的時候創建了與之通信的Socket后就程序就會往下執行了,就不會再回來為第二個人的連接創建負責通信的Socket了。(應該是每個人(每個客戶端)創建一個與之通信的Socket)所以要寫在循環里。 
            { 
                //等待客戶端連接;Accept()這個方法能接收客戶端的連接,并為新連接創建一個負責通信的Socket 
                Socket socketSend = socketWatch.Accept(); 
                dic.Add(socketSend.RemoteEndPoint.ToString(), socketSend); //(根據客戶端的IP地址和端口號找負責通信的Socket,每個客戶端對應一個負責通信的Socket),ip地址及端口號作為鍵,將負責通信的Socket作為值填充到dic鍵值對中。 
                //我們通過負責通信的這個socketSend對象的一個RemoteEndPoint屬性,能夠拿到遠程連過來的客戶端的Ip地址跟端口號 
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "連接成功");//效果:192.168.1.32:連接成功 
                comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString()); //將連接過來的每個客戶端都添加到combBox控件中。 
                //客戶端連接成功后,服務器應該接收客戶端發來的消息。  
                Thread getdata = new Thread(GetData); 
                getdata.IsBackground = true; 
                getdata.Start(socketSend); 
            } 
        } 
        Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); 
        /// <summary> 
        /// 不停的接收客戶端發送過來的消息 
        /// </summary> 
        /// <param name="o"></param> 
        void GetData(object o) 
        { 
            while (true) 
            { 
                Socket socketSend = o as Socket; 
                //將客戶端發過來的數據先放到一個字節數組里面去 
                byte[] buffer = new byte[1024 * 1024 * 2]; //創建一個字節數組,字節數組的長度為2M 
                //實際接收到的有效字節數; (利用Receive方法接收客戶端傳過來的數據,然后把數據保存到buffer字節數組中,返回一個接收到的數據的長度) 
                int r = socketSend.Receive(buffer); 
                if (r == 0) //如果接收到的有效字節數為0 說明客戶端已經關閉了。這時候就跳出循環了。 
                { 
                    //只有客戶端給用戶發消息,不可能是發0個長度的字節。即便發空消息,空消息也是有過個長度的。所有接收到的有效字節長度為0就代表客戶端已經關閉了 
                    break; 
                } 
                //將buffer這個字節數組里面的數據按照UTF8的編碼,解碼成我們能夠讀懂的的string類型,因為buffer這個數組的實際存儲數據的長度是r個 ,所以從索引為0的字節開始解碼,總共解碼r個字節長度。 
                string str = Encoding.UTF8.GetString(buffer, 0, r); 
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str); 
            } 
        } 
        private void ShowMsg(string str) 
        { 
            txtLog.AppendText(str + "/r/n"); //將str這個字符串添加到txtLog這個文本框中。 
        } 
        /// <summary> 
        /// 服務端給客戶端發信息 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void btnSend_Click_1(object sender, EventArgs e) 
        { 
            if (comboBox1.SelectedItem == null) //如果comboBox控件沒有選中值。就提示用戶選擇客戶端 
            { 
                MessageBox.Show("請選擇客戶端"); 
                return; 
            } 
            string str = txtMes.Text; //獲取用戶輸入的內容 (服務端要給客戶端發的信息) 
            byte[] strByte = Encoding.Default.GetBytes(str); //將信息轉換成二進制字節數組 
            string getIp = comboBox1.SelectedItem as string; //comboBox存儲的是客戶端的(ip+端口號) 
            Socket socketSend = dic[getIp] as Socket; //根據這個(ip及端口號)去dic鍵值對中找對應 賦值與客戶端通信的Socket【每個客戶端都有一個負責與之通信的Socket】 
            socketSend.Send(strByte); //將信息發送到客戶端 
        } 
    } 
}

開打開始命令  cmd   telnet 10.18.16.46 5000    即telnet 服務器ip地址  綁定的端口號

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久婷婷六月丁香| 亚洲伦理中文字幕| 欧美疯狂xxxx大交乱88av| 欧美日韩亚洲一区二区| 亚洲经典中文字幕| 国产精品一二三在线| 久久亚洲国产精品成人av秋霞| 日韩av高清不卡| 92国产精品视频| 51精品国产黑色丝袜高跟鞋| 日韩经典一区二区三区| 国产精品手机播放| 中文字幕无线精品亚洲乱码一区| 亚洲精品久久久一区二区三区| 日韩**中文字幕毛片| 国产情人节一区| 久久亚洲精品网站| 日韩欧美视频一区二区三区| 亚洲天堂av网| 国产成人拍精品视频午夜网站| 亚洲天堂网站在线观看视频| 91在线观看免费高清完整版在线观看| 日韩美女中文字幕| 亚洲xxx视频| 亚洲视屏在线播放| 色999日韩欧美国产| 日韩成人av在线| 高清欧美一区二区三区| 欧美最近摘花xxxx摘花| 91黑丝在线观看| 有码中文亚洲精品| 亚洲黄色在线观看| 国产精品男女猛烈高潮激情| 欧美一区二区大胆人体摄影专业网站| 午夜免费日韩视频| 久久视频在线播放| 久久99国产精品自在自在app| 欧美性xxxx极品高清hd直播| 亚洲人成自拍网站| 国语自产在线不卡| 国产精品一区二区三区久久| 中文字幕精品视频| 日韩经典中文字幕在线观看| 国产日韩欧美视频在线| 精品国内亚洲在观看18黄| 97超级碰碰人国产在线观看| 欧美日韩国产在线| 精品国产老师黑色丝袜高跟鞋| 91理论片午午论夜理片久久| 久久久亚洲福利精品午夜| 亚洲性线免费观看视频成熟| 久久成人国产精品| 欧美噜噜久久久xxx| 久久久久久久久久久久久久久久久久av| 在线观看久久久久久| 色婷婷综合成人av| 国产精品99免视看9| www.亚洲男人天堂| 久久久精品久久久久| 国产97在线视频| 欧美电影免费观看高清| 日韩欧美亚洲一二三区| 精品国产一区二区三区四区在线观看| 亚洲网站视频福利| 亚洲第一精品自拍| 欧美理论电影网| 亚洲片在线资源| 日韩一区av在线| 久久久女女女女999久久| 日韩欧美福利视频| 日韩美女av在线| www.亚洲天堂| 91精品国产91久久| 亚洲tv在线观看| 国产精品久久久久不卡| 91久久久久久国产精品| 亚洲国模精品一区| 欧美午夜精品久久久久久浪潮| 午夜精品蜜臀一区二区三区免费| 久久综合网hezyo| 久久久久久久久91| 在线亚洲国产精品网| 亚洲美女福利视频网站| 日韩av一区在线| 亚洲久久久久久久久久| 亚洲女人被黑人巨大进入| 88国产精品欧美一区二区三区| 91高潮精品免费porn| 大伊人狠狠躁夜夜躁av一区| 麻豆成人在线看| 在线视频免费一区二区| 久久99视频免费| 日av在线播放中文不卡| 午夜精品理论片| 日韩电视剧在线观看免费网站| 国产精品国产三级国产aⅴ9色| 国内外成人免费激情在线视频网站| 亚洲一区美女视频在线观看免费| 国产精品久久久av| 午夜精品一区二区三区在线视频| 国产精品久久久久久久久久小说| 欧美一区二区三区四区在线| 欧美激情精品久久久久久变态| 97人人模人人爽人人喊中文字| 欧美性xxxx极品hd欧美风情| 色妞欧美日韩在线| 久久久久久伊人| 91热精品视频| 国产精品久久久av久久久| 亚洲欧美成人网| 欧美激情一级二级| 亚洲视频在线视频| 国产精品福利网| 欧美一级片一区| 亚洲欧美成人在线| 欧美精品18videosex性欧美| 国产欧美婷婷中文| 欧美亚洲一级片| 97热在线精品视频在线观看| 亚洲欧美综合另类中字| 91在线视频免费| 亚洲免费电影在线观看| 韩国v欧美v日本v亚洲| 亚洲人成在线观看| 日本中文字幕久久看| 日韩在线观看视频免费| 国产精品第七影院| 日韩一区二区三区xxxx| 国产亚洲精品久久久| 欧美大片免费观看在线观看网站推荐| 亚洲综合精品一区二区| 久久久精品亚洲| 国产精品视频自在线| 亚洲自拍高清视频网站| 精品美女久久久久久免费| 日本免费在线精品| 国模吧一区二区| 国产精品久久97| 色综合色综合久久综合频道88| 欧美日韩国产一区中文午夜| 色婷婷av一区二区三区久久| 国产精品色婷婷视频| 国产欧美精品一区二区| 亚洲成人黄色网| 日韩精品久久久久久福利| 国产v综合v亚洲欧美久久| 久久久999精品免费| 2018中文字幕一区二区三区| 国产自摸综合网| 91青草视频久久| 欧美综合激情网| 亚洲一区二区三区视频播放| 亚洲色图av在线| 久久91精品国产| 欧美激情一区二区三级高清视频| 亚洲精品97久久| 亚洲一区二区福利| 亚洲综合小说区| 国模吧一区二区| 久久久99久久精品女同性| 日本a级片电影一区二区| 亚洲成人1234| 日韩精品免费在线视频| 九九热精品在线|