記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】
方案主要功能:
(1)客戶端同步監聽來自伺服器端的資料(開啟子執行緒監聽)
(2)客戶端向伺服器端傳送資料(主執行緒傳送,並控制)
(3)IsOnline判斷連線是否中斷,如中斷則子執行緒結束執行
TcpClient tcpClient;
NetworkStream ns;
Thread receiveThread;
/// <summary>
/// 網路連線
/// </summary>
private void client()
{
tcpClient = new TcpClient(); //建立一個TcpClient物件,自動分配主機IP地址和埠號
string ipaddr = this.IpAddress.Text;
int port = Int32.Parse(this.Port.Text);
//MessageBox.Show(ipaddr);
try
{
//發起TCP連線
tcpClient.Connect(ipaddr, port);
if (tcpClient != null)
{
MessageBox.Show("連線伺服器成功");
this.button1.Text = "關閉連線";
//獲得繫結的網路資料流
ns = tcpClient.GetStream();
Control.CheckForIllegalCrossThreadCalls = false;
//例項化並啟動接受訊息執行緒
receiveThread = new Thread(receive_message);
receiveThread.Start();
string mestext = "hello world!";
send_message(mestext);
connectFlag = true;
modeChangeInit();
}
else
{
MessageBox.Show("連線伺服器失敗");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 檢測TCP連線是否存在還是已經中斷
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public bool IsOnline(TcpClient c)
{
return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
}
//接收訊息
private void receive_message()
{
revWrong = 0;
while (IsOnline(tcpClient))
{
try
{
//建立接收資料的位元組流
byte[] getData = new byte[1024];
//從網路流中讀取資料
ns.Read(getData, 0, getData.Length);
//將位元組陣列轉換成文字形式
string getMsg = Encoding.Default.GetString(getData);
string msgStr = getMsg.Trim('\0');
if (!string.IsNullOrEmpty(msgStr))
processMsgInShow(msgStr);
}
catch (ThreadAbortException)
{
//捕捉到執行緒被終止異常則表示是人為的斷開TCP連線
//不彈出錯誤提示
break;
}
catch (Exception e)
{
//接受訊息發生異常
MessageBox.Show(e.Message);
//並釋放相關資源
if (ns != null)
ns.Dispose();
break;
}
}
MessageBox.Show("網路中斷");
/// 當接收中斷時
///if (ns != null)
/// ns.Dispose();
}
// 傳送指令
private void send_order(commandType no, string mesg)
{
string str = ((int)no).ToString();
string order = string.Format("*0{0};{1}#", str, mesg);
send_message(order);
}
private void send_message(string messageText)
{
//將要傳送的文字轉換為字元陣列形式
byte[] sendData = Encoding.Default.GetBytes(messageText);
//將資料寫入到網路資料流中
ns.Write(sendData, 0, sendData.Length);
}
//斷開連線
private void disconnect()
{
//斷開TCP連線
tcpClient.Close();
//銷燬繫結的網路資料流
ns.Dispose();
//銷燬接受訊息的執行緒
receiveThread.Abort();
//修改控制元件狀態
this.button1.Text = "連線";
connectFlag = false;
showMessage.Stop();
// 刪除時鐘
// showMessage.Dispose();
}
///////////////////////////////////////////////////////////
/// <summary>
/// 網路連線
/// </summary>
private void client()
{
tcpClient = new TcpClient(); //建立一個TcpClient物件,自動分配主機IP地址和埠號
string ipaddr = this.IpAddress.Text;
int port = Int32.Parse(this.Port.Text);
//MessageBox.Show(ipaddr);
try
{
//發起TCP連線
tcpClient.Connect(ipaddr, port);
if (tcpClient != null)
{
MessageBox.Show("連線伺服器成功");
this.button1.Text = "關閉連線";
//獲得繫結的網路資料流
ns = tcpClient.GetStream();
Control.CheckForIllegalCrossThreadCalls = false;
//例項化並啟動接受訊息執行緒
receiveThread = new Thread(receive_message);
receiveThread.Start();
string mestext = "hello world!";
send_message(mestext);
connectFlag = true;
}
else
{
MessageBox.Show("連線伺服器失敗");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 檢測TCP連線是否存在還是已經中斷
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public bool IsOnline(TcpClient c)
{
return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
}
//接收訊息
private void receive_message()
{
revWrong = 0;
while (IsOnline(tcpClient))
{
try
{
//建立接收資料的位元組流
byte[] getData = new byte[1024];
//從網路流中讀取資料
ns.Read(getData, 0, getData.Length);
//將位元組陣列轉換成文字形式
string getMsg = Encoding.Default.GetString(getData);
string msgStr = getMsg.Trim('\0');
if (!string.IsNullOrEmpty(msgStr))
processMsgInShow(msgStr);
}
catch (ThreadAbortException)
{
//捕捉到執行緒被終止異常則表示是人為的斷開TCP連線
//不彈出錯誤提示
break;
}
catch (Exception e)
{
//接受訊息發生異常
MessageBox.Show(e.Message);
//並釋放相關資源
if (ns != null)
ns.Dispose();
break;
}
}
MessageBox.Show("連線中斷");
}
// 傳送指令
private void send_message(string messageText)
{
//將要傳送的文字轉換為字元陣列形式
byte[] sendData = Encoding.Default.GetBytes(messageText);
//將資料寫入到網路資料流中
ns.Write(sendData, 0, sendData.Length);
}
//斷開連線
private void disconnect()
{
//斷開TCP連線
tcpClient.Close();
//銷燬繫結的網路資料流
ns.Dispose();
//銷燬接受訊息的執行緒
receiveThread.Abort();
//修改控制元件狀態
this.button1.Text = "連線";
connectFlag = false;
}
///////////////////////////////////////////////////////////
參考文章(1):https://blog.csdn.net/godsight/article/details/60968437
參考文章(2):https://www.cnblogs.com/Lexy/p/3556924.html
相關文章
- 客戶端筆記客戶端筆記
- 2020-09-30Socket 一個伺服器監聽多個客戶端 功能實現伺服器客戶端
- Redis學習筆記(十) 客戶端Redis筆記客戶端
- Python socket的客戶端Python客戶端
- 青芒 for Mac客戶端開發筆記Mac客戶端筆記
- Angular Universal 學習筆記 - 客戶端渲染和伺服器端渲染的區別Angular筆記客戶端伺服器
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- socket.io 客戶端與伺服器應用客戶端伺服器
- python socketserver處理客戶端的流程PythonServer客戶端
- C# MQTT客戶端C#MQQT客戶端
- netty服務端監聽客戶端連線加入和斷開事件Netty服務端客戶端事件
- 《golang筆記》第四篇-網路客戶端Golang筆記客戶端
- 比特幣學習筆記——————3、比特幣客戶端比特幣筆記客戶端
- Golang 學習筆記(一) - HTTP 客戶端 - 基礎Golang筆記HTTP客戶端
- Presto學習筆記——Go客戶端連線PrestoREST筆記Go客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- CAS5.3伺服器搭建與客戶端整合SpringBoot以及踩坑筆記伺服器客戶端Spring Boot筆記
- 有道雲筆記 Windows 客戶端,複製貼上 BUG筆記Windows客戶端
- 如果呼叫遠端遠端url介面為https,且存在客戶端證書驗證,如何在客戶端處理HTTP客戶端
- Neeto-Vue:我為了記筆記,手寫了一個為知筆記客戶端Vue筆記客戶端
- 以客戶端為中心的錯誤處理客戶端
- Golang 學習筆記(二) - HTTP 客戶端 - 使用 Client 型別Golang筆記HTTP客戶端client型別
- Dubbo-go 原始碼筆記(二)客戶端呼叫過程Go原始碼筆記客戶端
- .net socket.io客戶端使用過程客戶端
- c# 獲取客戶端IPC#客戶端
- UE 客戶端和伺服器上的時間同步客戶端伺服器
- Windows10 VS2017 C++ Server Socket簡單伺服器端與客戶端WindowsC++Server伺服器客戶端
- Windows客戶端的JProfiler遠端監控Linux上的Tomcat伺服器Windows客戶端LinuxTomcat伺服器
- 監聽發現區域網dropbox客戶端broadcast-dropbox-listener客戶端AST
- nginx 處理客戶端請求的完整過程Nginx客戶端
- C#之使用CefSharp建立客戶端C#客戶端
- C#版Nebula客戶端編譯C#客戶端編譯
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- 實現伺服器和客戶端資料互動,Java Socket有妙招伺服器客戶端Java
- 一次獲取客戶端 IP 記錄客戶端