----tcp(傳輸 控制 協(xié)議)是可靠消息:三次握手(發(fā)給對方,對方發(fā)給自己,證明對方接到消息,在發(fā)給對方,說明自己能接到對方消息,這樣就都知道了):tcp:每發(fā)送一次消息,對方都會回復(fù),證明接受到了所以是可靠地;包含許多校驗,效率差;
---(UDP:用戶 數(shù)據(jù)報 協(xié)議)數(shù)據(jù)報文服務(wù):消息發(fā)送給對方就完事了,不管你是否接收到;
不可靠,但是效率高;
-----應(yīng)用層協(xié)議:Http,Ftp,Popj SMTp
-----傳輸層:TCP,ICMP,UDP
-----網(wǎng)絡(luò)層:IP,ARP ;
socket是應(yīng)用層和傳輸層之間的交互;
---端口:三類:工人端口、注冊端口、動態(tài)私有端口(這些可以用)
---套接字指的是socket;封裝的網(wǎng)絡(luò)插口;
----服務(wù)端:1創(chuàng)建socket,綁定端口和ip;打開監(jiān)聽,接受客戶端;
----客戶端:創(chuàng)建socket,鏈接服務(wù)器,創(chuàng)建ip端口,進行鏈接;
--服務(wù)器端接受科幻段消息時,創(chuàng)建socketProxy對象,占用系統(tǒng)自動分配的
一個端口,發(fā)送消息時重新占用新的端口,原來端口繼續(xù)監(jiān)聽;
--說白了,監(jiān)聽端口收到消息創(chuàng)建新的socket對象,并綁定新的端口進行通信
--這個端口就幫死了,傳遞接受都用這一個端口),
而監(jiān)聽端口繼續(xù)監(jiān)聽,
? 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";
??????????? //創(chuàng)建ip地址:
??????????? IPAddress ipAddress = IPAddress.Parse(ip);
??????????? //創(chuàng)建端口
??????????? IPEndPoint ipPoint = new IPEndPoint(ipAddress, 3030);
??????????? //穿點套接字:
??????????? //參數(shù)1:尋址方式;參數(shù)2:socket傳輸方式:stream tcp方式,Dgram:數(shù)據(jù)報方式,第三個參數(shù):協(xié)議
??????????? Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
??????????? //綁定端口和ip
??????????? s.Bind(ipPoint);
??????????? //開始監(jiān)聽:(請求最大連接長度),s為委托參數(shù);
??????????? ThreadPool.QueueUserWorkItem(new WaitCallback(Accept), s);
?
??????? }
??????? public void Accept(object obj)
??????? {
??????????? Socket socket = (Socket)obj;
??????????? while (true)
??????????? {
??????????????? //接受客戶端的一個連接創(chuàng)建代理套接字
??????????????? 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)
??????????? {
??????????????? //通過判斷異常來判斷,是否客戶端已中斷,來關(guān)閉服務(wù)端的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)
??????? {
??????????? //發(fā)送消息
??????????? foreach (Socket s in list)
??????????? {
??????????????? //防止socket斷開失效;
??????????????? try
??????????????? {
??????????????????? string str = "發(fā)送內(nèi)容";
??????????????????? 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);
??????????????? //創(chuàng)建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傳遞的數(shù)據(jù)都是byte[]數(shù)組類型;
服務(wù)器端通過捕獲異常來知道客戶端關(guān)閉連接;
? Encoding.Default.GetBytes();
----503錯誤:訪問人數(shù)過多
--------
-------------字節(jié)塊拷貝: //字節(jié)塊拷貝:
??????????????? byte[] a = new byte[1024];
??????????????? byte[] b = new byte[1025];
??????????????? b[0] =1;//這樣可以說是自定義協(xié)議;第一個位代表什么意思;接受時根據(jù)第一個字節(jié)判斷是傳送的什么數(shù)據(jù)文件(比如1代表圖片)
??????????????? Buffer.BlockCopy(a, 0, b,1,a.Length);
---魔鬼數(shù)字:1代表什么2代表什么,千萬別使用,通常使用枚舉;
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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