C#以太網(wǎng)Sockets客戶端設(shè)計(jì)實(shí)現(xiàn)
更新時間:2023年02月06日 14:24:42 作者:cfqq1989
本文主要介紹了C#以太網(wǎng)Sockets客戶端設(shè)計(jì)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
【1】客戶端對象
using System.Net;// DNS_靜態(tài)對象 using System.Net.Sockets; // 字段位置 private Socket socket業(yè)務(wù); //對象既可以當(dāng)服務(wù)器,又可以當(dāng)客戶端 TcpListener tcpListener; //服務(wù)器對象 TcpClient tcpClient; //客戶端對象
【2】初始化
Socket tcpClient客戶端;
tcpClient客戶端 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
【3】連接
#region 連接 /// <summary> /// 建立連接 /// </summary> /// <param name="ip">IP地址</param> /// <param name="port">端口號</param> public void Connect(string ip, string port) { try { //實(shí)例化Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //設(shè)置Socket屬性 tcpClient.SendTimeout = this.SendTimeOut; tcpClient.ReceiveTimeout = this.ReceiveTimeOut; //封裝一個EndPoint對象 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port)); //建立連接 tcpClient.Connect(endPoint); } catch (Exception ex) { MessageBox.Show(ex.Message); }//顯示錯誤 } #endregion
【4】收發(fā)
#region 讀取并接受 /// <summary> /// 發(fā)送并接受 /// </summary> /// <param name="SendByte"></param> /// <returns></returns> public byte[] SendAndReceive(byte[] SendByte) { try { if (tcpClient.Available >= 1)// 丟棄字節(jié) { #region 加載 byte[] buffer = new byte[tcpClient.Available];//準(zhǔn)備加載 tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//開始加載 #endregion } #region 計(jì)時 //====現(xiàn)在時間====================================== str_發(fā)送后記時 = new StringBuilder(String.Format("{0,9}", DateTime.Now.Second.ToString() + "s" + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長度9 右對齊 #endregion tcpClient.Send(SendByte);// 發(fā)送 #region 委托 if (Help_ModBus.Wt_set != null) { Help_ModBus.Wt_set(SendByte, str_發(fā)送后記時.ToString()); } #endregion return ReadMessage(); } catch (Exception ex) { MessageBox.Show(ex.Message); }//顯示錯誤 finally { //InteractiveLock.Leave(); } return null; } /// <summary> /// 讀取緩沖區(qū)值 /// </summary> /// <returns></returns> private byte[] ReadMessage() { DateTime startTime = DateTime.Now;//記錄開始時間 do { if (tcpClient.Available >= 5 )// 字節(jié) { #region 計(jì)時 //====現(xiàn)在時間====================================== str_發(fā)送后記時 = new StringBuilder(String.Format("{0,9}", DateTime.Now.Second.ToString() + "s" + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長度9 右對齊 #endregion #region 加載 byte[] buffer = new byte[tcpClient.Available];//準(zhǔn)備加載 tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//開始加載 #endregion #region 委托 if (Help_ModBus.Wt_get != null)//委托呼叫ui { Help_ModBus.Wt_get(buffer, str_發(fā)送后記時.ToString());// ui顯示 } #endregion return buffer; } #region 超時跳出 if ((DateTime.Now - startTime).TotalMilliseconds > ReceiveTimeOut+500)// 超時 1.5s { break;// 已經(jīng)超時 } #endregion } while (true); return null; // 相當(dāng)失敗 //Thread.Sleep(ReceiveTimeOut);// 延時15ms //int count = tcpClient.Available; // 字節(jié) //if (count == 0) //{ // return null; //} //else //{ // byte[] buffer = new byte[count]; // tcpClient.Receive(buffer, count, SocketFlags.None); // //byte[] buffer2 = Encoding.Default.GetBytes(str_發(fā)送后記時.ToString()); // byte[] buffer3 = { buffer2 , buffer }; // //return buffer2; // #region 計(jì)時 // //====現(xiàn)在時間====================================== // str_發(fā)送后記時 = new StringBuilder(String.Format("{0,9}", // DateTime.Now.Second.ToString() + "s" // + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長度9 右對齊 // #endregion // if (Wt_get!=null) // { // Wt_get(buffer, str_發(fā)送后記時.ToString()); // } // return buffer; //} //================================== //int count = tcpClient.Available; //int cycletimer = 0; //while (count == 0) //{ // count = tcpClient.Available; // cycletimer++; // Thread.Sleep(20); // if (cycletimer > MaxCycleTimer) // { // break; // } //} //if (count == 0) //{ // return null; //} //else //{ // byte[] buffer = new byte[count]; // tcpClient.Receive(buffer, count, SocketFlags.None); // return buffer; //} } #endregion
【5】斷開
#region 斷開 /// <summary> /// 斷開連接 /// </summary> public void DisConnect() { if (tcpClient != null) { tcpClient.Close(); } } #endregion
參數(shù)參考:
C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)
到此這篇關(guān)于C#以太網(wǎng)Sockets客戶端設(shè)計(jì)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C#以太網(wǎng)Sockets客戶端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# WinForm國際化實(shí)現(xiàn)的簡單方法
這篇文章主要介紹了C# WinForm國際化實(shí)現(xiàn)的簡單方法,有需要的朋友可以參考一下2014-01-01C# WinForm 判斷程序是否已經(jīng)在運(yùn)行,且只允許運(yùn)行一個實(shí)例,附源碼
本文主要介紹WinFrom程序中只允許運(yùn)行一個實(shí)例的方法,并有完整的代碼示例,希望能給需要的朋友一些幫助。2016-04-04