C#以太網(wǎng)Sockets客戶端設(shè)計(jì)實(shí)現(xiàn)
【1】客戶端對(duì)象
using System.Net;// DNS_靜態(tài)對(duì)象 using System.Net.Sockets; // 字段位置 private Socket socket業(yè)務(wù); //對(duì)象既可以當(dāng)服務(wù)器,又可以當(dāng)客戶端 TcpListener tcpListener; //服務(wù)器對(duì)象 TcpClient tcpClient; //客戶端對(duì)象
【2】初始化
Socket tcpClient客戶端;
tcpClient客戶端 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
【3】連接
#region 連接 /// <summary> /// 建立連接 /// </summary> /// <param name="ip">IP地址</param> /// <param name="port">端口號(hào)</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; //封裝一個(gè)EndPoint對(duì)象 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port)); //建立連接 tcpClient.Connect(endPoint); } catch (Exception ex) { MessageBox.Show(ex.Message); }//顯示錯(cuò)誤 } #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);//開(kāi)始加載 #endregion } #region 計(jì)時(shí) //====現(xiàn)在時(shí)間====================================== str_發(fā)送后記時(shí) = new StringBuilder(String.Format("{0,9}", DateTime.Now.Second.ToString() + "s" + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長(zhǎng)度9 右對(duì)齊 #endregion tcpClient.Send(SendByte);// 發(fā)送 #region 委托 if (Help_ModBus.Wt_set != null) { Help_ModBus.Wt_set(SendByte, str_發(fā)送后記時(shí).ToString()); } #endregion return ReadMessage(); } catch (Exception ex) { MessageBox.Show(ex.Message); }//顯示錯(cuò)誤 finally { //InteractiveLock.Leave(); } return null; } /// <summary> /// 讀取緩沖區(qū)值 /// </summary> /// <returns></returns> private byte[] ReadMessage() { DateTime startTime = DateTime.Now;//記錄開(kāi)始時(shí)間 do { if (tcpClient.Available >= 5 )// 字節(jié) { #region 計(jì)時(shí) //====現(xiàn)在時(shí)間====================================== str_發(fā)送后記時(shí) = new StringBuilder(String.Format("{0,9}", DateTime.Now.Second.ToString() + "s" + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長(zhǎng)度9 右對(duì)齊 #endregion #region 加載 byte[] buffer = new byte[tcpClient.Available];//準(zhǔn)備加載 tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//開(kāi)始加載 #endregion #region 委托 if (Help_ModBus.Wt_get != null)//委托呼叫ui { Help_ModBus.Wt_get(buffer, str_發(fā)送后記時(shí).ToString());// ui顯示 } #endregion return buffer; } #region 超時(shí)跳出 if ((DateTime.Now - startTime).TotalMilliseconds > ReceiveTimeOut+500)// 超時(shí) 1.5s { break;// 已經(jīng)超時(shí) } #endregion } while (true); return null; // 相當(dāng)失敗 //Thread.Sleep(ReceiveTimeOut);// 延時(shí)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ā)送后記時(shí).ToString()); // byte[] buffer3 = { buffer2 , buffer }; // //return buffer2; // #region 計(jì)時(shí) // //====現(xiàn)在時(shí)間====================================== // str_發(fā)送后記時(shí) = new StringBuilder(String.Format("{0,9}", // DateTime.Now.Second.ToString() + "s" // + DateTime.Now.Millisecond.ToString() + "ms:")); //固定長(zhǎng)度9 右對(duì)齊 // #endregion // if (Wt_get!=null) // { // Wt_get(buffer, str_發(fā)送后記時(shí).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】斷開(kāi)
#region 斷開(kāi) /// <summary> /// 斷開(kāi)連接 /// </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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解MongoDB for C#基礎(chǔ)入門(mén)
本篇文章主要介紹了MongoDB for C#基礎(chǔ)入門(mén),具體介紹了c#中關(guān)于對(duì)MongoDB的連接,插入,查詢等,有需要的可以了解一下。2016-12-12C# WinForm國(guó)際化實(shí)現(xiàn)的簡(jiǎn)單方法
這篇文章主要介紹了C# WinForm國(guó)際化實(shí)現(xiàn)的簡(jiǎn)單方法,有需要的朋友可以參考一下2014-01-01C#中dynamic的使用方法及應(yīng)用場(chǎng)景
在 C# 編程中,dynamic 類(lèi)型是一個(gè)非常特殊的類(lèi)型,它在編譯時(shí)并不會(huì)進(jìn)行類(lèi)型檢查,而是在運(yùn)行時(shí)才進(jìn)行類(lèi)型解析,本文將詳細(xì)講解 dynamic 的使用方法、優(yōu)缺點(diǎn)以及一些實(shí)際應(yīng)用場(chǎng)景,需要的朋友可以參考下2024-08-08C# WinForm 判斷程序是否已經(jīng)在運(yùn)行,且只允許運(yùn)行一個(gè)實(shí)例,附源碼
本文主要介紹WinFrom程序中只允許運(yùn)行一個(gè)實(shí)例的方法,并有完整的代碼示例,希望能給需要的朋友一些幫助。2016-04-04