目錄
基礎概念
UI層所需控制元件及布局如下(左圖為基礎版,右圖為加強版)
在frmMain表單下宣告.net物件和公共變數
frmMain表單加載時,啟動訊息監聽執行緒
訊息監聽執行緒呼叫StartListen方法,用來以指定埠號監聽是否有訊息傳輸
啟動計時器,在計時器的Tick事件中判斷是否有訊息傳輸,如果有將資訊顯示在文本框中(表單抖動的代碼在我上一篇博客)
點擊“發送按鈕”向指定主機發送聊天訊息
關閉frmMain表單,停止網路監聽,同時終止訊息監聽執行緒
要一對一、一對多的發送資訊,實作聊天功能,需要用到C#網路編程的知識,需要用到System.Net、System.Net.Sockets和System.Net.Mail命名空間下的類,還需要知道網路編程的基本概念,
基礎概念
IP:每個電腦都有一個IP地址,在局域網內IP地址是可變的,
TCP協議(傳輸控制協議):是面向連接的傳輸層協議,應用程式在使用TCP之前,必須先建立TCP連接,在傳輸資料完畢后,必須釋放已經建立的連接(跟打電話是否類似),TCP可以保證從一端將資料傳送至連接的另一端時,資料能夠準確送達,而且送到的資料的排列順序和送出時的順序相同,
UDP協議(用戶資料報協議):是無連接的通信協議,不保證可靠的資料傳輸,但能夠向若干個目標發送資料,接收發自若干個源的資料,(在線影片,下載檔案),
埠(Port):如果把IP地址比作一間房子 ,埠就是出入這間房子的門,
套接字(Socket)用于將應用程式與埠連接起來,類似于連接電器與電線的插座,
UI層所需控制元件及布局如下(左圖為基礎版,右圖為加強版)
主要控制元件RichTextBox*2,TextBox*2,Button*3,Timer*1

具體代碼如下:
在frmMain表單下宣告.net物件和公共變數
private Thread td; //宣告執行緒物件
private TcpListener tcpListener1; //宣告監聽物件
private static string message = ""; //記錄發送的訊息
frmMain表單加載時,啟動訊息監聽執行緒
//表單加載時 啟動監聽執行緒
private void frmMain_Load(object sender, EventArgs e)
{
td = new Thread(new ThreadStart(this.StartLinsten)); //創建執行緒類物件
td.Start(); //啟動執行緒
timer1.Start(); //啟動計時器
}
訊息監聽執行緒呼叫StartListen方法,用來以指定埠號監聽是否有訊息傳輸
如果有,將訊息記錄下來
[Obsolete]
private void StartLinsten()
{
message = ""; // 清空訊息
tcpListener1 = new TcpListener(888); //創建監聽物件
tcpListener1.Start(); //開始監聽
while (true) //死回圈+可以創建一個執行緒執行
{
TcpClient tclient = tcpListener1.AcceptTcpClient(); //接收連接請求
NetworkStream nstream = tclient.GetStream(); // 獲取資料流
byte[] mbyet = new byte[1024]; //建立快取
int i = nstream.Read(mbyet, 0, mbyet.Length); //將資料流寫入快取+接收實際收到的資訊
message = Encoding.Default.GetString(mbyet, 0, i); //記錄發送的訊息 轉為字串
}
}
啟動計時器,在計時器的Tick事件中判斷是否有訊息傳輸,如果有將資訊顯示在文本框中(表單抖動的代碼在我上一篇博客)
[Obsolete]
private void timer1_Tick(object sender, EventArgs e)
{
if (message != "")
{
string[] strIP = message.Split(new char[2] { '(',')'});
// comboBox1.Items.Add( str[1]); //獲取IP名
string Computername= Dns.Resolve(strIP[1]).HostName; //獲取電腦名
if (!comboBox1.Items.Contains(Computername))
{
comboBox1.Items.Add(Computername); //下拉選單存盤,對方IP的電腦名
}
if (message.Contains("[抖一抖]"))
{
Shake.Vibration(this) //表單抖動
}
rtbContent.AppendText(message); //將接受的訊息添加到文本框中 追加
rtbContent.ScrollToCaret(); //自動滾動文本框的滾動條
message = ""; //清空訊息
}
}
點擊“發送按鈕”向指定主機發送聊天訊息
[Obsolete]
private void button2_Click(object sender, EventArgs e)
{
try
{
#region 發送訊息
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName()); //獲取自己主機名
string strmsg = " " + txtName.Text + "(" + ip[1].ToString() + ")" + DateTime.Now.ToLongTimeString() + "\n" + "" + this.rtbSend.Text + "\n"; //定義訊息格式
TcpClient client = new TcpClient(txtIP.Text, 888); // 創建TCPClient物件
NetworkStream netstream = client.GetStream(); //創建NetworkStream
StreamWriter wstream = new StreamWriter(netstream, Encoding.Default);
wstream.Write(strmsg); //將訊息寫入網路流
wstream.Flush(); //釋放網路流物件
wstream.Close(); //關閉網路流物件
client.Close(); //關閉TCPClient
#endregion
//以上折疊的代碼可以封裝到一個類中
//string comboitem = comboBox1.Text;
//IPAddress[] nameToIp = Dns.GetHostAddresses(comboitem); //獲取主機名;
//string strmsg = Chat.SendMessage(txtName.Text, nameToIp[1].ToString(), rtbSend.Text);
rtbContent.AppendText(strmsg); //將發送的訊息添加到文本框
rtbContent.ScrollToCaret(); //自動滾動文本框的滾動條
rtbSend.Clear(); // 清空發送訊息文本框
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
關閉frmMain表單,停止網路監聽,同時終止訊息監聽執行緒
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.tcpListener1 != null) //判斷監聽物件是否關閉
{
tcpListener1.Stop(); //停止監聽
}
if (td != null) //判斷執行緒是否為空
{
if (td.ThreadState == ThreadState.Running) //判斷執行緒是否正在運行中
{
td.Abort(); //終止執行緒
}
}
}
如果本篇博客對您有一定的幫助,大家記得留言+點贊哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227989.html
標籤:其他
上一篇:HDFS的HA集群原理分析
