亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# Socket的TCP通訊的實例代碼

2020-01-24 00:52:25
字體:
來源:轉載
供稿:網友

Socket的TCP通訊

一、 socket的通訊原理

服務器端的步驟如下。

(1)建立服務器端的Socket,開始偵聽整個網絡中的連接請求。

(2)當檢測到來自客戶端的連接請求時,向客戶端發送收到連接請求的信息,并建立與客戶端之間的連接。

(3)當完成通信后,服務器關閉與客戶端的Socket連接。

客戶端的步驟如下。

(1)建立客戶端的Socket,確定要連接的服務器的主機名和端口。

(2)發送連接請求到服務器,并等待服務器的回饋信息。

(3)連接成功后,與服務器進行數據的交互。

(4)數據處理完畢后,關閉自身的Socket連接。

二、 socket的通訊方式

socket通訊方式有兩種:同步和異步

同步工作方式:

用TCP協議進行編程時程序執行到發送、接收和監聽語句的時候,在未完成工作前不再繼續往下執行,即處于阻塞狀態,直到該語句完成某個工作后才繼續執行下一條語句。

異步工作方式

程序執行到發送、接收和監聽語句的時候,不論工作是否完成,都會繼續往下執行。

三、 socket的C#實現

1.1.      同步:

服務端客戶端通信

在與服務端的連接建立以后,我們就可以通過此連接來發送和接收數據。端口與端口之間以流(Stream)的形式傳輸數據,因為幾乎任何對象都可以保存到流中,所以實際上可以在客戶端與服務端之間傳輸任何類型的數據。對客戶端來說,往流中寫入數據,即為向服務器傳送數據;從流中讀取數據,即為從服務端接收數據。對服務端來說,往流中寫入數據,即為向客戶端發送數據;從流中讀取數據,即為從客戶端接收數據。

服務端:

(1)服務端對端口進行偵聽:

服務器端建立一個socket,設置好本機的ip和監聽的端口與socket進行綁定,開始監聽連接請求,當接收到連接請求后,發送確認,同客戶端建立連接,開始與客戶端進行通信。

TcpListener listener =new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));//ip為服務器IP地址,port為監聽的端口Listener.Start();//開啟監聽

(2)檢測來自客戶端的連接請求

TcpClient remoteClient = listener.AcceptTcpClient();//接收客戶端 這里體現了同步的含義,如果客戶端對該服務端發起連接的時候,程序在這里就會等待(阻塞),直到有客戶端的連接請求為止

(3)建立和連接的客戶端的數據流(傳輸數據)

NetworkStream streamToClient = remoteClient.GetStream();

該數據流只要是用來接收和發送數據,同步也分多客戶端和單個客戶端,如果分的詳細一點的話,還有客戶端的一條以及多條數據的情況,如果是單個客戶端的多條數據的話,連接客戶端之后,在建立數據流的前面添加一個循環就可以了,如果是多個客戶端的話,在(2)前面加個循環就可以了。為了接收數據的效率,建議不管是同步還是異步,服務端都做成線程,詳細見Demo

(4)接收客戶端發送過來的數據(用緩存來接收)

byte[] buffer = new byte[BufferSize]; // BufferSize為緩存的大小 int bytesRead;  try {  lock (streamToClient)//為了保證數據的完整性以及安全性 鎖定數據流   {     bytesRead = streamToClient.Read(buffer, 0, BufferSize);} 

(5)向連接的客戶端發送數據

lock (streamToClient)           {           streamToClient.Write(buffer, 0, buffer.Length);//buffer為發送的字符數組         } 

 (6)釋放數據流和TcpClient(以便下次的數據以及客戶端的收發)

streamToClient.Dispose();//釋放數據流中的數據 remoteClient.Close();//釋放TcpClient實例 

客戶端

(1)   連接服務器

TcpClient tcp = new TcpClient();tcp.Connect(IP,Port);//根據服務器的IP地址和偵聽的端口連接if (tcp.Connected){//連接成功的消息機制 詳細見DEMOShowGetData("成功連接上了服務器:", this.strIP.Text.ToString());  } 

這里需要注意的是,不管是使用有參數的構造函數與服務器連接,或者是通過Connect()方法與服務器建立連接,都是同步方法(或者說是阻塞的,英文叫block)。它的意思是說,客戶端在與服務端連接成功、從而方法返回,或者是服務端不存、從而拋出異常之前,是無法繼續進行后繼操作的。這里還有一個名為BeginConnect()的方法,用于實施異步的連接,這樣程序不會被阻塞,可以立即執行后面的操作,這是因為可能由于網絡擁塞等問題,連接需要較長時間才能完成。網絡編程中有非常多的異步操作,凡事都是由簡入難,關于異步操作,我們后面再討論,現在只看同步操作。

(2)   建立連接服務端的數據流

NetworkStream streamToServer = tcp.GetStream(); 

(3)   接收和發送數據

//發送字符串byte[] buffer = Encoding.Unicode.GetBytes(msg); //msg為發送的字符串   try     {       lock (streamToServer)      {      streamToServer.Write(buffer, 0, buffer.Length);   // 發往服務器       }     //接收字符串       buffer = new byte[BufferSize];       lock (streamToServer)      {        bytesRead = streamToServer.Read(buffer, 0, BufferSize);      }} 

1.2.      異步

相對于同步,異步中的連接,接收和發送數據的方法都不一樣,都有一個回調函數,就是即使不能連接或者接收不到數據,程序還是會一直執行下去,如果連接上了或者接到數據,程序會回到這個回調函數的地方重新往下執行。詳細見下面:

服務器:

1、 開啟偵聽接口

private TcpListener listener;        //監聽類listener = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));listener.Start();//開啟偵聽,對連接的客戶端的數目沒有限制

或者

listener.Start(int i);// 開啟偵聽,最多只能連接i個客戶端數目 

2、 接收客戶端

listener.BeginAcceptSocket(clientConnect, listener);//異步接受客戶端的連接請求  clientConnect為連接的回調函數

     /// <summary>    /// 接收回調函數    /// </summary>    /// <param name="ar"></param>    private void clientConnect(IAsyncResult ar)    {    try      {        TcpListener listener = (TcpListener)ar.AsyncState;        //接受客戶的連接,得到連接的Socket        Socket client = listener.EndAcceptSocket(ar);      }      catch { }    } 

3、 接收客戶端發送的數據

/// <summary> /// 異步接收數據 /// </summary> private void receiveData(Socket client){   // 調用異步方法 BeginReceive 來告知 socket 如何接收數據  IAsyncResult iar = client.BeginReceive(buffer, 0, BagSize, SocketFlags.None, out errorCode, receiveCallback, buffer);      }   }    /// <summary>    /// 接收數據回調函數    /// </summary>     /// <param name="ar"></param>    private void receiveCallback(IAsyncResult ar)    {             //接收到的數據長度.        int receLen = 0;        try        {          receLen = client.EndReceive(ar, out errorCode);        if (receLen > 0)         {           OnReceiveData(client);//接收到數據之后的處理函數          }        }       catch {   }      }      else { }    } 

4、接收成功之后,回發數據給客戶端

/// <summary>/// 異步發送報文/// </summary> /// <param name="data"></param> private void OnReceiveData (Socket socket){     string strLogin = “succeed recived”;byte[] data = Encoding.ASCII.GetBytes(strLogin); socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, sendCallBack, socket);//異步發送數據     }      else      { }    }/// <summary> /// 異步發送回調事件 /// </summary> /// <param name="ar"></param>private void sendCallBack(IAsyncResult ar)    {socket.EndSend(ar, out errorCode);     } 

客戶端

1、連接服務器

private TcpClient tcpcz = null tcpcz = new TcpClient() tcpcz.BeginConnect(ipaddress, Convert.ToInt32(port), new AsyncCallback(ConnectCallback), tcpcz);//根據服務器的IP地址和端口號 異步連接服務器 /// <summary>/// 異步連接的回調函數 /// </summary> /// <param name="ar"></param> private void ConnectCallback(IAsyncResult ar)    {      TcpClient t = (TcpClient)ar.AsyncState;      try      {        if (t.Connected)        {          t.EndConnect(ar);//函數運行到這里就說明連接成功        }        else        {        }      }      catch () {  }    } 

2、發送和接收字符串

NetworkStream stream = tcp.GetStream();//創建于服務器連接的數據流        //發送字符串  string strLogin = “this is socket example”;  byte[] data = Encoding.ASCII.GetBytes(strLogin); stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback),stream);//異步發送數據 //接收字符串  byte[] result = new byte[tcp.Available]; // tcp.Available為接受的字符串大小  try {   stream.BeginRead(result, 0, result.Length, new AsyncCallback(ReadCallback), stream);//異步接受服務器回報的字符串  }    catch { }    string strResponse = Encoding.ASCII.GetString(result).Trim();//從服務器接受到的字符串 }  }     catch ()     {     }   } 

以上是這一段時間對socket的一些心得,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久奇米色影视| 97免费在线视频| 国产精品日韩电影| 久久久999国产| 最近更新的2019中文字幕| 亚洲国产精品高清久久久| 久久久久久尹人网香蕉| 中国日韩欧美久久久久久久久| 69精品小视频| 亚洲性生活视频| 中文字幕亚洲情99在线| 国产成人亚洲综合91| 亚洲伊人久久大香线蕉av| 国产精品普通话| 国产精品成久久久久三级| 午夜精品一区二区三区在线| 蜜月aⅴ免费一区二区三区| 一区二区欧美激情| 成人免费在线视频网址| 欧美在线免费观看| 日韩精品免费在线播放| 国产精品入口日韩视频大尺度| 欧美性猛交xxxx乱大交| 欧美多人乱p欧美4p久久| 在线视频欧美日韩| 日韩在线激情视频| 亚洲欧美激情四射在线日| 国产精品美女视频网站| 国产91热爆ts人妖在线| 国产欧美最新羞羞视频在线观看| 精品视频偷偷看在线观看| 超碰97人人做人人爱少妇| 欧美日产国产成人免费图片| 最近2019中文免费高清视频观看www99| 成人黄色片在线| 伊人久久精品视频| 97av在线视频免费播放| 日韩毛片在线看| 琪琪亚洲精品午夜在线| 国产91对白在线播放| 欧美夫妻性生活xx| 日韩视频在线观看免费| 欧美激情一区二区三区高清视频| 亚洲色图在线观看| 久久成人这里只有精品| 亚洲精品小视频在线观看| 在线成人中文字幕| 亚洲sss综合天堂久久| 日韩欧美在线看| 国产欧美一区二区三区四区| 久久亚洲国产成人| 国产精品私拍pans大尺度在线| 九九综合九九综合| 81精品国产乱码久久久久久| 久久精品视频一| 亚洲第一网站免费视频| 精品日韩中文字幕| 成人精品在线视频| 久久久久久久久久久国产| 91国产中文字幕| 国产福利精品av综合导导航| 日本欧美一级片| 国产精品国产三级国产aⅴ9色| 综合网日日天干夜夜久久| 欧洲s码亚洲m码精品一区| 国产97色在线| 成人xvideos免费视频| 91精品久久久久久久久青青| 成人精品一区二区三区电影黑人| 欧美xxxx做受欧美| 亚洲日本欧美中文幕| 欧美激情一区二区三区高清视频| 久久久久国产精品免费网站| 视频在线观看99| 91极品视频在线| 国产精品日韩欧美| 国产91成人video| xxx一区二区| 亚洲www在线| 国产精品美女在线观看| 亚洲第一偷拍网| 91久久久久久久久久| 欧美极品美女视频网站在线观看免费| 日韩欧美中文第一页| 欧美亚洲国产视频| 国产精品久久av| 91久久久久久| 久久久久北条麻妃免费看| 日韩免费在线视频| 国产精品美女网站| 国产精品激情av电影在线观看| 亚洲a在线播放| 亚洲综合自拍一区| 成人黄色中文字幕| 日本道色综合久久影院| 欧美成人午夜激情| 91高清视频免费| 亚洲人永久免费| 91豆花精品一区| 久久99久久亚洲国产| 国产国语刺激对白av不卡| 国产精品av在线播放| 中文字幕久久亚洲| 91在线观看免费高清完整版在线观看| 蜜月aⅴ免费一区二区三区| 久久婷婷国产麻豆91天堂| 成人网页在线免费观看| 欧美一级电影免费在线观看| 欧美成aaa人片在线观看蜜臀| 少妇av一区二区三区| 精品久久久久久久中文字幕| 久久97精品久久久久久久不卡| 亚洲男女自偷自拍图片另类| 国产精品偷伦一区二区| 国产精品人人做人人爽| 欧美日韩美女在线| 欧美大尺度在线观看| 亚洲а∨天堂久久精品喷水| 国产a∨精品一区二区三区不卡| 亚洲国产第一页| 亚洲激情视频在线| 亚洲91精品在线观看| 日韩av在线免费播放| 福利视频一区二区| 午夜精品www| 色综合色综合网色综合| 麻豆国产精品va在线观看不卡| 欧美成人三级视频网站| 亚洲аv电影天堂网| 欧美激情精品久久久| 精品一区二区三区四区在线| 久久伊人精品一区二区三区| 亚洲精品一区二区三区婷婷月| 91人人爽人人爽人人精88v| 亚洲欧美一区二区激情| 日韩av大片免费看| 亚洲精品欧美一区二区三区| 久久天堂av综合合色| 久久久av电影| 日韩经典中文字幕在线观看| 国产一区二区三区丝袜| 亚洲欧洲午夜一线一品| 日本一欧美一欧美一亚洲视频| 国产成人精品久久亚洲高清不卡| 欧美色道久久88综合亚洲精品| 欧美在线中文字幕| 精品久久久久久久久久久| 日韩精品福利网站| 亚洲a级在线观看| 日韩亚洲综合在线| 91在线免费观看网站| 国产成人精品一区| 亚洲香蕉成人av网站在线观看| 自拍亚洲一区欧美另类| 欧洲精品毛片网站| 成人写真福利网| 国产精品视频免费观看www| 日韩激情视频在线| 夜夜嗨av一区二区三区免费区| 欧美在线激情网| 国产成人精品久久| 日韩欧美极品在线观看| 亚洲欧美日韩国产中文专区| 久久综合色影院|