同步非同步SOCKET通訊和多執行緒總結
同步套接字通訊
Socket支援下的網上點對點的通訊服務端實現監聽連線,客戶端實現傳送連線請求,建立連線後進行傳送和接收資料的功能 伺服器端建立一個socket,設定好本機的ip和監聽的埠與socket進行繫結,開始監聽連線請求,當接收到連線請求後,傳送確認,同客戶端建立連線,開始與客戶端進行通訊。
客戶端建立一個socket,設定好伺服器端的IP和提供服務的埠,發出連線請求,接收到服務的確認後,盡力連線,開始與伺服器進行通訊。
伺服器端和客戶端的連線及它們之間的資料傳送均採用同步方式。
Socket
Socket是tcpip網路協議介面。內部定義了許多的函式和例程。可以看成是網路通訊的一個端點。在網路通訊中需要兩個主機或兩個程序。通過網路傳遞資料,程式在網路對話的每一端需要一個
Tcp/IP傳輸層使用協議埠將資料傳送給一個主機的特定應用程式,協議埠是一個應用程式的程序地址。傳輸層模組的網路軟體模組要於另一個程式通訊,它將使用協議埠,socket是執行在傳輸層的api,使用socket建立連線傳送資料要指定一個埠給它。Socket:Stream Socket流套接字
Socket提供雙向、有序、無重複的資料流服務,出溜大量的網路資料。Dgram socket資料包套接字支援雙向資料流,不保證傳輸的可靠性、有序、無重複。Row socket
原始套接字訪問底層協議 建立socket
用C#
名稱空間:using System.Net;usingSystem.Net.Socket;
AddressFamily
用來指定socket解析地址的定址方案。Inte.Network標示需要ip版本4的地址,Inte.NetworkV6需要ip版本6的地址
SocketType引數指定socket型別Raw支援基礎傳輸協議訪問,Stream支援可靠,雙向,基於連線的資料流。ProtocolType表示socket支援的網路協議 定義主機物件:IPEndPoint
原型:1)public IPEndPoint(IPAddress
address,int port)2)public IPEndPoint(long address,int port)
引數1整型int64如123456,引數2埠int32
主機解析: 利用DNS伺服器解析主機,使用Dns.Resolve方法 原型:public static IPHostEntry Resolve(stringhostname)
引數:待解析的主機名稱,返回IPHostEntry類值,IPHostEntry為Inte.Net主機地址資訊提供容器,該容器提供存有IP地址列表,主機名稱等。Dns.GetHostByName獲取本地主機名稱 原型:public static IPHostEntryGetHostByName(string hostname)
GetHostByAddress
原型:1)public static IPHostEntryGetHostByAddress(IPAddress address)
引數:IP地址 2)public
static IPHostEntryGetHostByAddress(string address) IP地址格式化字串 埠繫結和監聽: 同步套接字伺服器主機的繫結和埠監聽Socket類的Bind(繫結主機),Listen(監聽埠),Accept(接收客戶端的連線請求)Bind:原型:publicvoid
Bind(EndPoint LocalEP)引數為主機物件 IPEndPoint
Listen:原型:public
void Listen(int backlog) 引數整型數值,掛起佇列最大值accept:原型:public
socket accept() 返回為套接字物件 演示程式:
IPAddress myip=IPAddress.Parse(“127.0.0.1”);
IPEndPoint myserver=new IPEndPoint(myip,2020);
Socket sock=new Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);
Sock.Bind(myserver);
Sock.Listen(50);
Socket bbb=sock.Accept();
傳送資料:方法1:socket類的send方法二.NetworkStream類Write
send原型:publicint
Send(byte[] buffer) 位元組陣列 public intSend(byte[],SocketFlags)原型2說明,SocketFlags成員列表:DontRoute(不使用路由表傳送),MaxIOVectorLength(為傳送和接收資料的wsabuf結構數量提供標準值)None
不對次呼叫使用標誌) OutOfBand(訊息的部分發送或接收)Partial(訊息的部分發送或接收)
Peek(檢視傳入的訊息) 原型三:public intSend(byte[],int,SocketFlags)
引數二要傳送的位元組數 原型四:public intSend(byte[],int,int,SocketFlags)
引數二為Byte[]中開始傳送的位置 演示:
Socket bbb=sock.Accept();
Byte[] bytes=new Byte[64];
string send="aaaaaaaaaaaa";
bytes=System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());
bbb.Send(bytes,bytes.length,0);//將byte陣列全部發送
.NetWordStream類的Write方法傳送資料 原型:public override void write(byte[]buffer,int offset,int size)
位元組陣列,開始位元組位置,總位元組數
Socket bbb=sock.Accept();
.NetWorkStream stre=new NewWorkStream(bbb);
Byte[] ccc=new Byte[512];
string sendmessage="aaaaaaaaaaaaaa";
ccc=System.Text.Encoding.BigEndianUnicode.GetBytes(sendmessage);
stre.Write(ccc,0,ccc.length);
接收資料:Socket類Receive.NetworkStream類Read
Socket類Receive方法 原型:public int Receive(byte[] buffer)
2)public int Receive(byte[],SocketFlags)
3)public int Receive(byte[],int,SocketFlags)
4)public int Receive(byte[],int,int,SocketFlags)
.....
Socket bbb=sock.Accept();
........
Byte[] ccc=new Byte[512];
bbb.Receive(ccc,ccc.Length,0);
string rece=System.Text.Encoding.BigEndianUnicode.GetString(ccc);
richTextBox1.AppendText(rece+"rn");
.NetworkStream類的Read方法接收資料
public override int Read(int byte[] buffer,int offset,int size)
演示:bbb=sock.Accept();
.......
.NetworkStream stre=new.NetworkStream(bbb);
Byte[] ccc=new Byte[512];
stre.Read(ccc,0,ccc.Length);
string readMessage=System.Text.Encoding.BigEndianUnicode.GetString(ccc);
執行緒 執行緒建立:System.Threading空間下的Thread類的構造方法: 原型:public Thread(ThreadStart start)ThreadStart型別值 Thread thread=new Thread(newThreadStart(accp));
Private void accp(){}//使用執行緒操作 執行緒啟動
Thread thread=new Thread(new ThreadStart(accp));
執行緒暫停與重新啟動 啟動執行緒使用Thread.Sleep是當前執行緒阻塞一段時間Thread.Sleep(Timeout.Infinite)是執行緒休眠,直到被呼叫Thread.Interrrupt的另一個執行緒中斷或被Thread.Abort中止。
一個執行緒不能對另一個呼叫Sleep,可以使用Thread.Suspend來暫停執行緒,當執行緒對自身呼叫Thread.Suspend將阻塞,直到該執行緒被另一個執行緒繼續,當一個執行緒對另一個呼叫,該呼叫就成為使另一個執行緒暫停的非阻塞呼叫。呼叫Thread.Resume使另一個執行緒跳出掛起狀態並使該執行緒繼續執行,而與呼叫Thread.Suspend的次數無關 執行緒休眠:Thread.Sleep(10000);
執行緒掛起:Thread thread=new Thread(newThreadStart(accp));
Thread.start();
Thread.Suspend();
重新啟動:Thread thread=new Thread(newThreadStart(accp));
Thread.start();
Thread.Suspend();
Thread.Resume();
阻塞執行緒的方法:thread.Join使用一個執行緒等待另一個執行緒停止
Thread.Join
Public void Join();
Public void Join(int millisecondsTimeout);毫秒
Public bool Join(TimeSpan timeout);時間間隔型別值 例項:Thread thread=new Thread(newThreadStart(accp));
Thread.start();
Thread.Join(10000);
執行緒銷燬:
Thread.Abort,Thread.Interrupt
Abort方法引發ThreadAbortException,開始中止此執行緒的過程,是一個可以由應用程式程式碼捕獲的特殊異常,ResetAbort
可以取消Abort請求,可以組織ThreadAbortException終止此執行緒,執行緒不一定會立即終止,根本不終止。
對尚未啟動的執行緒呼叫Abort,則當呼叫Start時該執行緒將終止。對已經掛起的執行緒呼叫Abort,則該執行緒將繼續,然後終止。對阻塞或正在休眠的執行緒呼叫Abort,則該執行緒被中斷,然後終止。Thread類的Abort方法:
Public void Abort()
Public void Abort(object stateinfo);
演示:
Thread thread=new Thread(new ThreadStart(accp));
Thread.Start();
Thread.Abort();
Thread.Join(10000);
Socket程式設計原理:Unix的i/o命令集,模式為開-讀/寫-關open
write/read close
使用者程序進行i/o操作 使用者程序呼叫開啟命令,獲取檔案或裝置的使用權,並返回描述檔案或裝置的整數,以描述使用者開啟的程序,該程序進行讀寫操作,傳輸資料,操作完成,程序關閉,通知os對哪個物件進行了使用。Unix網路應用程式設計:BSD的套接字socket,unix的SystemV
的TLI。 套接字程式設計的基本概念: 網間程序通訊:源於單機系統,每個程序在自己的地址範圍內進行執行,保證互相不干擾且協調工作。作業系統為程序之間的通訊提供設施:Unix BSD
管道pipe,命名管道namedpipe軟中斷訊號signal
Unix System V
訊息message
共享儲存區shared memory
訊號量semaphore
以上僅限於本機程序之間通訊。 埠:網路上可以被命名和定址的通訊埠,是作業系統可以分配的一種資源,網路通訊的最終地址不是主機地址,是可以描述程序的摸中識別符號。TCP/IP提出協議埠porotocol
port埠,表示通訊程序。 程序通過os呼叫繫結連線埠,而在傳輸層傳輸給該埠的資料傳入程序中處理,同樣在程序的資料需要傳給傳輸層也是通過繫結埠實現。程序對埠的操作相當於對os中的i/o檔案進行操作,每一個埠也對應著一個埠號,tcp/ip協議分為tcp和udp,雖然有相同port
number的埠,但是互相也不**。埠號的分配有全域性分配,本地分配(動態分配),當程序需要訪問傳輸層,os分配給程序一個埠號。全域性分配,就是os固定分配的埠,標準的伺服器都有固定的全域性公認的埠號提供給服務。小於256的可以作為保留埠。
地址:網路通訊中的兩臺機器,可以不再同一個網路,可能間隔(閘道器,網橋,路由器等),所以可以分為三層定址 機器在不同的網路則有該網路的特定id
同一個網路中的機器應該有唯一的機器id
一臺機器內的程序應該有自己的唯一id
通常主機地址=網路ID+主機ID
tcp/ip中使用16位埠號來表示程序。 網路位元組順序,高價先存,tcp和udp都使用16或32整數位的高價儲存,在協議的標頭檔案中。 半相關:在網路中一個程序為協議+本地地址+埠號=三元組,也叫半相關,表示半部分。 全相關:兩臺機器之間通訊需要使用相同協議協議+本地地址+本地埠號+遠端地址+遠端埠號五元組全相關。 順序:兩個連續的報文在網路中可能不會通過相同的路徑到達,所以接收的順序會和傳送的順序不一致。順序是接收順序與傳送順序一致。Tcp/ip提供該功能。差錯控制:檢查資料差錯:檢查和CheckSum機制檢查連線差錯:雙方確認應答機制。流控制:雙方傳輸資料過程中,保證資料傳輸速率的機制,保證資料不丟失。 位元組流:把傳輸中的報文當作一個位元組序列,不提供任何資料邊界。 全雙工/半雙工:兩個方向傳送或一個方向傳送快取/帶外資料:位元組流服務中,沒有報文邊界,可以同一時刻讀取任意長度的資料。為保證傳輸正確或流協議控制,需要使用快取,互動型的應用程式禁用快取。 資料傳送中,希望不通過常規傳輸方式傳送給使用者以便及時處理的某一類資訊(unix系統的中斷鍵delete,Control-c)、終端流控制符Control-s、Control-q)為帶外資料。 客戶/伺服器模式主動請求方式:
1.開啟通訊通道,通知本地主機,在某一個公認地址上接收客戶請求
2.等待客戶請求到達埠
3.接收到重複服務請求,處理請求傳送應答訊號。接收到併發服務請求。要啟用一個新程序處理客戶請求,unix系統fork、exec,新程序處理客戶請求,不需要對其他請求作出應答,服務完成後,關閉此程序與客戶的通訊鏈路。終止4.返回第二步,等待另一個客戶請求。5.關閉服務端 客戶方:1.開啟一通訊通道,並連線到伺服器所在主機的特定埠。2.向伺服器傳送服務請求報文,等待並接收應答;繼續提出請求…….
3.請求結束以後關閉通訊通道並終止。 :1.客戶與伺服器程序的作用非對稱,編碼不同2.服務程序先於客戶請求而啟動,系統執行,服務程序一致存在,直到正常退出或強迫退出 套接字型別:TCP/IP的socket
Sock_stream可靠的面對連線資料傳輸,無差錯、無重複傳送,安照順序傳送接收,內設流量控制,避免資料流超限,資料為位元組流,無長度限制,ftp流套接字。
Sock_DGRAM 無連線的服務,資料包以**包的形式傳送,不提供無措保證,資料可能丟失重複,傳送接收的順序混亂,網路檔案系統nfs使用資料報式套接字。
Sock_Ram 介面允許較底層協議,IP,ICMP直接訪問,檢查新的協議實現或訪問現有服務中配置的新裝置。 服務端:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
Thread mythread ;
Socket socket;
// 清理所有正在使用的資源。 protected override void Dispose(bool disposing )
{
try
{
socket.Close();//釋放資源 mythread.Abort ( ) ;//中止執行緒 }
catch{ }
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} public static IPAddressGetServerIP()
{
IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());
return ieh.AddressList[0];
}
private void BeginListen()
{
IPAddress ServerIp=GetServerIP();
IPEndPoint iep=newIPEndPoint(ServerIp,8000);
socket=new
Socket(AddressFamily.Inte.Network,SocketType.Stream,ProtocolType.Tcp);
byte[] byteMessage=new byte[100]; this.label1.Text=iep.ToString();
socket.Bind(iep);
// do
while(true)
{
try
{
socket.Listen(5);
Socket newSocket=socket.Accept();
newSocket.Receive(byteMessage);
string sTime =DateTime.Now.ToShortTimeString ( ) ;
string msg=sTime+":"+"Message from:";
msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);
this.listBox1.Items.Add(msg);
}
catch(SocketException ex)
{
this.label1.Text+=ex.ToString();
}
}
// while(byteMessage!=null);
}
//開始監聽 private void button1_Click(objectsender, System.EventArgs e)
{
try
{
mythread = new Thread(newThreadStart(BeginListen));
mythread.Start();
}
catch(System.Exception er)
{
MessageBox.Show(er.Message,"完成",MessageBoxButtons.OK,MessageBoxIcon.Stop);
}
}
using System.Net;
using System.Net.Sockets;
using System.Text;
private void button1_Click(object sender, System.EventArgs e)
{
BeginSend(); }
private void BeginSend()
{ string ip=this.txtip.Text;
string port=this.txtport.Text;
IPAddress serverIp=IPAddress.Parse(ip); int serverPort=Convert.ToInt32(port);
IPEndPoint iep=new IPEndPoint(serverIp,serverPort); byte[] byteMessage;
相關推薦
C#.net同步非同步SOCKET通訊和多執行緒總結(5)tcp傳送和接受的程式碼
基於TCP協議的傳送和接收端 TCP協議的接收端 using System.Net.Sockets ; //使用到TcpListen類 using System.Threading ; //使用到執行緒 using System.IO ; //使用到StreamReader類 int port = 800
同步非同步SOCKET通訊和多執行緒總結
同步套接字通訊 Socket支援下的網上點對點的通訊服務端實現監聽連線,客戶端實現傳送連線請求,建立連線後進行傳送和接收資料的功能 伺服器端建立一個socket,設定好本機的ip和監聽的埠與socket進行繫結,開始監聽連線請求,當接收到連線請求後,傳送確認,同
C#.net同步非同步SOCKET通訊和多執行緒總結2
服務端: using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的資
Socket通訊-accept+多執行緒
偶然的機會,重新寫了一下windows下socket通訊的比較基礎的程式碼, 太久沒有接觸socket以及多執行緒,查了不少部落格,但是發現大部分內容比較陳舊, 所以決定寫一篇部落格,順便自己總結一下。 內容簡介 網路通訊基本
多程序間通訊方式和多執行緒同步機制總結
多程序之間通訊方式: 檔案對映:本地之間 共享記憶體:本地之間 匿名管道:本地之間 命名管道:跨伺服器 郵件槽:一對多的傳輸資料,通常通過網路向一臺Windo
nodejs學習筆記(二)——javascript的同步非同步行為和多執行緒
寫過後臺的同學一定對執行緒、執行緒池或者是多執行緒這些概念不會陌生,但是前臺在HTML5之前很少會提及,因為在HTML5之前javascript都是單執行緒的。下面用一個簡單的例子來說明一下單執行緒: setInterval(function(){ var date
《Java》Java“定時器和多執行緒”實際應用——執行緒同步
一、任務目標 將任務<Java“定時器和多執行緒”實際應用——定時器配合多執行緒>中的兩個執行緒修改為互斥的,以保證兩個執行緒不會同時對此類屬性x進行修改。 二、執行緒同步機制 在Java中提供了同步機制,可以有效地防止資源衝突。同步機制使用 sy
Qt:Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒)
Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 前言 感覺Winsock網路程式設計的api其實和Linux下網路程式設計的api非常像,其實和其他程式語言的網路程式設計都差不太多。博主用Qt實現的,當然不想用黑視窗唄,有介面可以看到,由於GUI程式設計
AsyncContext非同步和多執行緒區別
AsyncContext不是非同步輸出時使用的,而是同步輸出,但是解放伺服器端的執行緒使用,使用AsyncContext的時候,對於瀏覽器來說,他們是同步在等待輸出的,但是對於伺服器端來說,處理此請求的執行緒並沒有卡在那裡等待,則是把當前的處理轉為執行緒池處理了,關鍵就在於執行緒池,伺服器端會起一個執行緒
基於socket和多執行緒的聊天程式設計與實現
【要求】 1. 設計一款多人聊天程式,包括伺服器端和客戶端; 2. 伺服器先執行,自動獲取IP,建立socket並繫結在2017埠; 3. 客戶端通過IP地址連線伺服器端,由argv[1]提供IP地址,回車後提示輸入暱稱,然後登入伺服器; 4. 
socket ( java ) 簡單多個客戶端、服務端通訊(多執行緒)
實現: 客戶端:多個socket(多個埠),其中一個客戶端的一個埠用於接收服務端傳送過來的訊息,其一個用於向服務端傳送訊息。其它客戶端只有發訊息的功能。 服務端:兩個socket,一個用於迴圈接收客戶端傳送過來的socket請求。一個用於接收訊息手自動向客戶端
併發執行,程序同步,程序互斥,非同步,並行,多執行緒的區別
1. 幾個概念 1.1 併發 在作業系統的一個時間段中,有幾個程式同時處於啟動執行到執行完畢之間的狀態,且這幾個程式都在同一個處理機上執行。 併發又有偽併發和真併發:偽併發是指單核處理器的併發,真併發是指多核處理器的併發。 1.2 互斥 併發程
VS2013 Windows API 串列埠通訊程式設計--多執行緒非同步方式
轉載自:blog.csdn.net/mingojiang 1.串列埠通訊基礎 提到串列埠讓人想起並口,它們是計算機中兩個比較重要的通訊方式. 串列埠:也叫COM口,把位元組的二進位制位按位列隊進行傳輸,每個位元組佔一個固定的時間長,速度慢,但是傳輸距離遠, 有9針和25針
PyQt5中非同步重新整理UI和Python中的多執行緒總結
目前任務需要做一個介面程式,PyQt是非常方便的選擇,QT豐富的控制元件以及python方便的程式設計。近期遇到介面中執行一些後臺任務時介面卡死的情況,解決了在這裡記錄下。 PyQt PyQt簡介 PyQt是Qt的python介面,P
多程序和多執行緒之間的通訊方式及通訊實現步驟小結
程序間通訊方式 # 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (namedpipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。 #
非同步和多執行緒有什麼區別
非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主執行緒不需要同步等待在這個函式呼叫上, 從而可以讓主執行緒繼續執行它下面的程式碼.與此同時, 系統會通過從ThreadPool中取一個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這
非同步呼叫和多執行緒的架構設計
繼續分析架構設計,http call是ios程式常用的與伺服器通訊和同步資料的方式,框架層給我們提供了簡單的同步和非同步方法,今天就想分析分析,同步和非同步。 首先不考慮同步和非同步的內部實現,但就兩種方式的特性,兩種方法都能完成功能,可是具體到架構的時候我們用哪一種呢??
用程式碼說話:synchronized關鍵字和多執行緒訪問同步方法的7種情況
synchronized關鍵字在多執行緒併發程式設計中一直是元老級角色的存在,是學習併發程式設計中必須面對的坎,也是走向Java高階開發的必經之路。 一、synchronized性質 synchronized是Java提供的內建鎖機制,有如下兩種特性: 互斥性:即在同一時間最多隻有一個執行緒能持有這種鎖。當
C#中的非同步和多執行緒
許多開發人員對非同步程式碼和多執行緒以及它們的工作原理和使用方法都有錯誤的認識。在這裡,你將瞭解這兩個概念之間的區別,並使用c#實現它們。 我:“服務員,這是我第一次來這家餐廳。通常需要4個小時才能拿到食物嗎?” 服務員:“哦,是的,先生。這家餐廳的廚房裡只有一個廚師。” 我:“……只有一個廚師嗎?” 服務員
C#非同步和多執行緒以及Thread、ThreadPool、Task區別和使用方法
本文的目的是為了讓大家瞭解什麼是非同步?什麼是多執行緒?如何實現多執行緒?對於當前C#當中三種實現多執行緒的方法如何實現和使用?什麼情景下選用哪一技術更好? 第一部分主要介紹在C#中非同步(async/await)和多執行緒的區別,以及async/await使用方法。 第二部分主要介紹在C#多執行緒當中Thr