C#以太網(wǎng)Sockets客戶端設計實現(xiàn)
更新時間:2023年02月06日 14:24:42 作者:cfqq1989
本文主要介紹了C#以太網(wǎng)Sockets客戶端設計實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
【1】客戶端對象
using System.Net;// DNS_靜態(tài)對象 using System.Net.Sockets; // 字段位置 private Socket socket業(yè)務; //對象既可以當服務器,又可以當客戶端 TcpListener tcpListener; //服務器對象 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
{
//實例化Socket
tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//設置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];//準備加載
tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//開始加載
#endregion
}
#region 計時
//====現(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 計時
//====現(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];//準備加載
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; // 相當失敗
//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 計時
// //====現(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ù)參考:
到此這篇關(guān)于C#以太網(wǎng)Sockets客戶端設計實現(xiàn)的文章就介紹到這了,更多相關(guān)C#以太網(wǎng)Sockets客戶端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關(guān)文章
Windows系統(tǒng)中C#讀寫ini配置文件的程序代碼示例分享
這篇文章主要介紹了C#讀寫ini配置文件的程序代碼示例分享,在Windows下可以利用Win32的API函數(shù)輕松實現(xiàn),需要的朋友可以參考下2016-04-04
C#實現(xiàn)訪問Web API Url提交數(shù)據(jù)并獲取處理結(jié)果
Web API 是 Web 服務器和 Web 瀏覽器之間的應用程序處理接口,我們常見的模式是訪問 Web API Url 地址,并獲取 Json 、XML或其它指定格式的處理結(jié)果, 本文我們介紹了使用C#實現(xiàn)訪問Web API Url提交數(shù)據(jù)并獲取處理結(jié)果,需要的朋友可以參考下2024-05-05

