最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Socket網(wǎng)絡(luò)編程實例

 更新時間:2015年01月21日 14:23:57   投稿:shichen2014  
這篇文章主要介紹了C# Socket網(wǎng)絡(luò)編程實例,分析了Socket網(wǎng)絡(luò)通信的原理與具體應用技巧,具有一定參考借鑒價值,需要的朋友可以參考下

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

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

TCP協(xié)議:安全穩(wěn)定,一般不會發(fā)生數(shù)據(jù)丟失,但是效率低。利用TCP發(fā)生數(shù)據(jù)一般經(jīng)過3次握手(所有效率低,自己百度三次握手)

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

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

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

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

相關(guān)文章

  • C#獲取文件創(chuàng)建時間的方法

    C#獲取文件創(chuàng)建時間的方法

    這篇文章主要介紹了C#獲取文件創(chuàng)建時間的方法,涉及C#文件操作的技巧及CreattionTime屬性的使用方法,需要的朋友可以參考下
    2015-04-04
  • C#對文件名智能排序的算法

    C#對文件名智能排序的算法

    這篇文章介紹了C#對文件名智能排序的算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實例

    C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實例

    這篇文章主要介紹了C#使用Socket發(fā)送和接收TCP數(shù)據(jù)的實現(xiàn)方法,以實例的形式詳細講述了C#實現(xiàn)socket通信的完整實現(xiàn)過程,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C#移除字符串中的不可見Unicode字符 案例代碼

    C#移除字符串中的不可見Unicode字符 案例代碼

    最近發(fā)現(xiàn)某個數(shù)據(jù)采集的系統(tǒng)拿下來的數(shù)據(jù),有些字段的JSON被莫名截斷了,導致后續(xù)數(shù)據(jù)分析的時候解析JSON失敗,這篇文章主要介紹了C#移除字符串中的不可見Unicode字符 ,需要的朋友可以參考下
    2023-02-02
  • C#中Datetimepicker出現(xiàn)問題的解決方法

    C#中Datetimepicker出現(xiàn)問題的解決方法

    這篇文章主要給大家介紹了關(guān)于C#中Datetimepicker出現(xiàn)問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • C#用表達式樹構(gòu)建動態(tài)查詢的方法

    C#用表達式樹構(gòu)建動態(tài)查詢的方法

    這篇文章主要介紹了C#用表達式樹構(gòu)建動態(tài)查詢的方法,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-12-12
  • C#基礎(chǔ)概念二十五問 16-20

    C#基礎(chǔ)概念二十五問 16-20

    C#基礎(chǔ)概念二十五問 16-20...
    2007-04-04
  • C#結(jié)合數(shù)據(jù)庫的數(shù)據(jù)采集器示例

    C#結(jié)合數(shù)據(jù)庫的數(shù)據(jù)采集器示例

    這篇文章主要介紹了C#結(jié)合數(shù)據(jù)庫的數(shù)據(jù)采集器,功能比較實用,需要的朋友可以參考下
    2014-07-07
  • c#使用dynamic類型優(yōu)化反射的方法

    c#使用dynamic類型優(yōu)化反射的方法

    dynamic是FrameWork4.0的新特性,下面這篇文章主要給大家介紹了關(guān)于c#使用dynamic類型優(yōu)化反射的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • Winform控件優(yōu)化之圓角按鈕1

    Winform控件優(yōu)化之圓角按鈕1

    這篇文章主要介紹了Winform控件優(yōu)化之圓角按鈕,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08

最新評論

翁源县| 射洪县| 剑阁县| 长垣县| 石屏县| 乌恰县| 建昌县| 宁海县| 建宁县| 繁昌县| 宝清县| 芮城县| 陵川县| 庄浪县| 香港 | 蒲城县| 湖北省| 县级市| 盱眙县| 常熟市| 彩票| 大化| 竹山县| 崇明县| 嘉峪关市| 顺平县| 玉门市| 南召县| 开化县| 崇礼县| 赣州市| 和田县| 福州市| 边坝县| 张家港市| 柳江县| 克拉玛依市| 黄陵县| 广平县| 永泰县| 句容市|