----tcp(傳輸 控制 協議)是可靠消息:三次握手(發給對方,對方發給自己,證明對方接到消息,在發給對方,說明自己能接到對方消息,這樣就都知道了):tcp:每發送一次消息,對方都會回復,證明接受到了所以是可靠地;包含許多校驗,效率差;
---(UDP:用戶 數據報 協議)數據報文服務:消息發送給對方就完事了,不管你是否接收到;
不可靠,但是效率高;
-----應用層協議:Http,Ftp,Popj SMTp
-----傳輸層:TCP,ICMP,UDP
-----網絡層:IP,ARP ;
socket是應用層和傳輸層之間的交互;
---端口:三類:工人端口、注冊端口、動態私有端口(這些可以用)
---套接字指的是socket;封裝的網絡插口;
----服務端:1創建socket,綁定端口和ip;打開監聽,接受客戶端;
----客戶端:創建socket,鏈接服務器,創建ip端口,進行鏈接;
--服務器端接受科幻段消息時,創建socketProxy對象,占用系統自動分配的
一個端口,發送消息時重新占用新的端口,原來端口繼續監聽;
--說白了,監聽端口收到消息創建新的socket對象,并綁定新的端口進行通信
--這個端口就幫死了,傳遞接受都用這一個端口),
而監聽端口繼續監聽,
? public partial class Form1 : Form
??? {
??????? List<Socket> list = new List<Socket>();
??????? public Form1()
??????? {
??????????? InitializeComponent();
??????? }
??????? private void Form1_Load(object sender, EventArgs e)
??????? {
?
??????? }
?
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? string ip = "192.168.1.1";
??????????? //創建ip地址:
??????????? IPAddress ipAddress = IPAddress.Parse(ip);
??????????? //創建端口
??????????? IPEndPoint ipPoint = new IPEndPoint(ipAddress, 3030);
??????????? //穿點套接字:
??????????? //參數1:尋址方式;參數2:socket傳輸方式:stream tcp方式,Dgram:數據報方式,第三個參數:協議
??????????? Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
??????????? //綁定端口和ip
??????????? s.Bind(ipPoint);
??????????? //開始監聽:(請求最大連接長度),s為委托參數;
??????????? ThreadPool.QueueUserWorkItem(new WaitCallback(Accept), s);
?
??????? }
??????? public void Accept(object obj)
??????? {
??????????? Socket socket = (Socket)obj;
??????????? while (true)
??????????? {
??????????????? //接受客戶端的一個連接創建代理套接字
??????????????? Socket proxys = socket.Accept();
??????????????? //存儲這些通信管道;
??????????????? list.Add(proxys);
??????????????? //獲取套接字端口和ip;
??????????????? // proxys.RemoteEndPoint.ToString();
??????????? ????ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptStarts), proxys);
??????????? }
??????? }
??????? public void AcceptStarts(object obj)
??????? {
??????????? Socket socket = (Socket)obj;
??????????? while (true)
??????????? {
??????????????? //通過判斷異常來判斷,是否客戶端已中斷,來關閉服務端的socket;
??????????????? try
??????????????? {
??????????????????? byte[] buffer = new byte[1024 * 1024];
??????????????????? int realLength = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
??????????????????? string strResult = Encoding.Default.GetString(buffer, 0, buffer.Length);
??????????????? }
??????????????? catch
??????????????? {
??????????????????? socket.Close();
??????????????????? //異常已失效斷開的socket;
??????????????????? list.Remove(socket);
??????????????? }
???? ???????}
??????? }
?
??????? private void button2_Click(object sender, EventArgs e)
??????? {
??????????? //發送消息
??????????? foreach (Socket s in list)
??????????? {
??????????????? //防止socket斷開失效;
??????????????? try
??????????????? {
??????????????????? string str = "發送內容";
??????????????????? byte[] bytes = Encoding.Default.GetBytes(str);
??????????????????? s.Send(bytes, SocketFlags.None);
??????????????? }
??????????????? catch
??????????????? {
??????????????????? s.Close();
????? ??????????????//異常已失效斷開的socket;
??????????????????? list.Remove(s);
??????????????? }
??????????? }
??????? }
??? }
--------------------客戶端
?public partial class 客戶端 : Form
??? {
??????? public Socket CurrentSocket { get; set; }
??????? public 客戶端()
????? ??{
??????????? InitializeComponent();
??????? }
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? Socket socket =null;
??????????? try
??????????? {
??????????????? IPAddress ipAddress = IPAddress.Parse("192.168.1.1");
??????????????? IPEndPoint endpoint = new IPEndPoint(ipAddress, 8080);
??????????????? //創建socket;
??????????????? socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
??????????????? socket.Connect(endpoint);
????????????? ??CurrentSocket = socket;
??????????? }
??????????? catch
??????????? {
??????????????? if (socket != null)
??????????????? {
??????????????????? socket.Dispose();
??????????????? }
??????????? }
??????? }
?
??????? private void button2_Click(object sender, EventArgs e)
??????? {
??????????? byte[] bytes = Encoding.Default.GetBytes("sdfsdfd");
??????????? if (CurrentSocket != null)
??????????? {
??????????????? try
??????????????? {
??????????????????? CurrentSocket.Send(bytes, 0, bytes.Length, 0);
??????????????? }
??????????????? catch
??????????????? {
??????????????????? CurrentSocket.Dispose();
??????????????? }
??????????? }
??????? }
??? }
socket傳遞的數據都是byte[]數組類型;
服務器端通過捕獲異常來知道客戶端關閉連接;
? Encoding.Default.GetBytes();
----503錯誤:訪問人數過多
--------
-------------字節塊拷貝: //字節塊拷貝:
??????????????? byte[] a = new byte[1024];
??????????????? byte[] b = new byte[1025];
??????????????? b[0] =1;//這樣可以說是自定義協議;第一個位代表什么意思;接受時根據第一個字節判斷是傳送的什么數據文件(比如1代表圖片)
??????????????? Buffer.BlockCopy(a, 0, b,1,a.Length);
---魔鬼數字:1代表什么2代表什么,千萬別使用,通常使用枚舉;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
