一、網絡編程相關概念
1、 互聯網通過ip定位電腦
2、 在電腦中通過port定位程序
3、 程序和程序之間通過協議定義通信數據格式

二、Socket相關概念
1、 ip地址
1) 每臺聯網的電腦都有一個唯一的ip地址。
2) 長度32位,分為4段,每段8位,用十進制表示,每段范圍0~255.
3) 特殊ip:127.0.0.1用戶本地網卡測試。
2、 端口
1) 網絡中有很多電腦,這些電腦一般運行了多個網絡程序,每種網絡程序都打開一個Socket,并綁定到一個端口上,不同的端口對應不同的網絡程序。
2) 常用端口,21 ftp, 25 smtp,110 pop3,80 http,443 https
3、 Socket通俗理解:人和人通過電話來通訊,電話號碼就相當于是ip地址,人就是程序,套接字就是程序間的電話,程序和程序之間通訊,需要定義通訊協議,就像兩個人打電話要先定義好彼此說的語言,這樣才能正常通訊。
4、 Socket流式(服務端和客戶端)

1) 服務器welcoming socket開始監聽端口(負責監聽客戶端的連接信息)
2) 客戶端client socket連接服務端制定端口(負責接收和發送服務端信息)
3) 服務端welcoming socket監聽到客戶端連接,創建connection socket(負責和客戶端通訊)
Demo1
服務端代碼:
委托類DGCloseConn

1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace C03聊天室服務端7 {8 public delegate void DGCloseConn(string endpoint);9 }View Code委托類DGShowMsg

1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace C03聊天室服務端7 {8 public delegate void DGShowMsg(string msg);9 }View CodeMsgConnection類

1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 using System.Net; 6 using System.Net.Sockets; 7 using System.Threading; 8 9 namespace C03聊天室服務端 10 { 11 /// <summary> 12 /// 通信管理類 - 負責 處理 與某個 客戶端通信的過程 13 /// </summary> 14 public class MsgConnection 15 { 16 /// <summary> 17 /// 與某個 客戶端通信的套接字 18 /// </summary> 19 Socket sokMsg = null; 20 /// <summary> 21 /// 通信線程 22 /// </summary> 23 Thread thrMsg = null; 24 /// <summary> 25 /// 在窗體顯示消息的方法 26 /// </summary> 27 DGShowMsg dgShow = null; 28 /// <summary> 29 /// 關閉 客戶端連接 方法 30 /// </summary> 31 DGCloseConn dgCloseConn = null; 32 33 #region 0.0 構造函數 34 public MsgConnection(Socket sokMsg, DGShowMsg dgShow, DGCloseConn dgCloseConn) 35 { 36 this.sokMsg = sokMsg; 37 this.dgShow = dgShow; 38 this.dgCloseConn = dgCloseConn; 39 //創建通信線程 負責 調用 通信套接字 來接受客戶端消息 40 thrMsg = new Thread(ReceiveMsg); 41 thrMsg.IsBackground = true; 42 thrMsg.Start(this.sokMsg); 43 } 44 #endregion 45 46 bool isReceive = true; 47 #region 2.0 接收客戶端消息 48 void ReceiveMsg(object obj) 49 { 50 Socket sokMsg = obj as Socket; 51 //3.通信套接字 監聽 客戶端的 消息 52 //3.1創建 消息緩存區 53 byte[] arrMsg = new byte[1024 * 1024 * 1]; 54 try 55 { 56 while (isReceive) 57 { 58 //3.2接收客戶端的消息 并存入 緩存區,注意:Receive方法也會阻斷當前的線程 59 // 并 返回 真實 接收到客戶端 數據的 字節長度 60 int realLength = sokMsg.Receive(arrMsg); 61 //3.3將接收到的消息 轉成 字符串 62 string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 0, realLength); 63 //3.4將消息 顯示到 文本框 64 dgShow(strMsg); 65 } 66 } 67 catch (Exception ex) 68 { 69 //調用 窗體類的 關閉移除方法 70 dgCloseConn(sokMsg.RemoteEndPoint.ToString()); 71 //顯示消息 72 dgShow("客戶端斷開連接~!"); 73 } 74 } 75 #endregion 76 77 #region 3.0 向客戶端發送 文本消息 +void SendMsg(string msg) 78 /// <summary> 79 /// 3.0 向客戶端發送 文本消息 80 /// </summary> 81 /// <param name="msg"></param> 82 public void SendMsg(string msg) 83 { 84 //使用 指定的 通信套接字 將 字符串 發送到 指定的客戶端 85 byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(msg); 86 try 87 { 88 byte[] newArr = MakeNew("str", arrMsg); 89 sokMsg.Send(newArr); 90 } 91 catch (Exception ex) 92 { 93 dgShow("異常:" + ex.Message); 94 } 95 } 96 #endregion 97 98 #region 4.0 向客戶端 發送 文本 文件 +void SendFile(string strPath) 99 /// <summary>100 /// 4.0 向客戶端 發送 文本 文件101 /// </summary>102 /// <param name="strFilePath"></param>103 public void SendFile(string strFilePath)104 {105 //6.2 讀取要發送的文件106 byte[] arrFile = System.IO.File.ReadAllBytes(strFilePath);107 byte[] arrNew = MakeNew("file", arrFile);108 //6.3 向客戶端 發送文件109 sokMsg.Send(arrNew);110 } 111 #endregion112 113 #region 5.0 向客戶端 發送抖屏命令 +void SendShake()114 /// <summary>115 /// 5.0 向客戶端 發送抖屏命令116 /// </summary>117 public void SendShake()118 {119 sokMsg.Send(new byte[1] { 2 });120 } 121 #endregion122 123 #region 5.0 返回帶標識的 新數組 +byte[] MakeNew(string type, byte[] oldArr)124 /// <summary>125 /// 返回帶標識的 新數組126 /// </summary>127 /// <param name="type"></param>128 /// <param name="oldArr"></param>129 /// <returns></returns>130 public byte[] MakeNew(string type, byte[] oldArr)131 {132 //6.2 創建一個新數組(是原數組長度 + 1)133 byte[] newArrFiel = new byte[oldArr.Length + 1];134 //6.3 將原數組數據 復制到 新數組中(從新數組下標為1的位置放)135 oldArr.CopyTo(newArrFiel, 1);136 //6.4 根據 內容類型, 為新數組第一個元素 設置標識符號137 switch (type.ToLower())138 {139 case "str":140 newArrFiel[0] = 0;//只能存 0-255之間的數值, 'a'; // byte = 8 bit , 1bit = 1個 0 或者 1 , 256 141 break;142 case "file":143 newArrFiel[0] = 1;144 break;145 default:146 newArrFiel[0] = 2;147 break;148 }149 return newArrFiel;150 } 151 #endregion152 153 #region 4.0 關閉通信154 /// <summary>155 /// 關閉通信156 /// </summary>157 public void Close()158 {159 isReceive = false;160 sokMsg.Close();161 sokMsg = null;162 } 163 #endregion164 }165 }View CodeFormServer
新聞熱點
疑難解答