記筆記: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
相關文章
- 客戶端筆記客戶端筆記
- 客戶端儲存筆記客戶端筆記
- 客戶端無法同步時間伺服器問題處理客戶端伺服器
- Redis學習筆記(十) 客戶端Redis筆記客戶端
- 筆記:MMM客戶端啟動流程筆記客戶端
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+UDP伺服器客戶端】WindowsUDP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- 青芒 for Mac客戶端開發筆記Mac客戶端筆記
- Oracle 10g RAC客戶端配置監聽Oracle 10g客戶端
- Angular Universal 學習筆記 - 客戶端渲染和伺服器端渲染的區別Angular筆記客戶端伺服器
- Python socket的客戶端Python客戶端
- C++客戶端程式(socket)C++客戶端
- 2020-09-30Socket 一個伺服器監聽多個客戶端 功能實現伺服器客戶端
- socket.io 客戶端與伺服器應用客戶端伺服器
- Kafka 處理器客戶端介紹Kafka客戶端
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- C# MQTT客戶端C#MQQT客戶端
- 客戶端的socket是否需要bind?客戶端
- 《golang筆記》第四篇-網路客戶端Golang筆記客戶端
- Golang 學習筆記(一) - HTTP 客戶端 - 基礎Golang筆記HTTP客戶端
- 《精通比特幣》筆記~比特幣客戶端比特幣筆記客戶端
- 學習筆記:客戶端物件層次(一):BOM筆記客戶端物件
- Presto學習筆記——Go客戶端連線PrestoREST筆記Go客戶端
- python socketserver處理客戶端的流程PythonServer客戶端
- Redis 是如何處理命令的(客戶端)Redis客戶端
- ZooKeeper客戶端事件序列化處理客戶端事件
- netty服務端監聽客戶端連線加入和斷開事件Netty服務端客戶端事件
- 有道雲筆記 Windows 客戶端,複製貼上 BUG筆記Windows客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- ORACLE 中記錄客戶端MAC地址Oracle客戶端Mac
- Oracle10g RAC - 客戶端,Server端tnsnames.ora及監聽設定Oracle客戶端Server
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- [rsync+inotify]——監控客戶端檔案變化,rsync同步到伺服器客戶端伺服器
- 以客戶端為中心的錯誤處理客戶端
- 如果呼叫遠端遠端url介面為https,且存在客戶端證書驗證,如何在客戶端處理HTTP客戶端
- Neeto-Vue:我為了記筆記,手寫了一個為知筆記客戶端Vue筆記客戶端
- UE 客戶端和伺服器上的時間同步客戶端伺服器