小言_互联网的博客

C#实现聊天功能

347人阅读  评论(0)
 

目录

基础概念

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对象和公共变量


  
  1. private Thread td; //声明线程对象
  2. private TcpListener tcpListener1; //声明监听对象
  3. private static string message = ""; //记录发送的消息

frmMain窗体加载时,启动消息监听线程


  
  1. //窗体加载时 启动监听线程
  2. private void frmMain_Load(object sender, EventArgs e)
  3. {
  4. td = new Thread( new ThreadStart( this.StartLinsten)); //创建线程类对象
  5. td.Start(); //启动线程
  6. timer1.Start(); //启动计时器
  7. }

消息监听线程调用StartListen方法,用来以指定端口号监听是否有消息传输

如果有,将消息记录下来


  
  1. [ Obsolete]
  2. private void StartLinsten()
  3. {
  4. message = ""; // 清空消息
  5. tcpListener1 = new TcpListener( 888); //创建监听对象
  6. tcpListener1.Start(); //开始监听
  7. while ( true) //死循环+可以创建一个线程执行
  8. {
  9. TcpClient tclient = tcpListener1.AcceptTcpClient(); //接收连接请求
  10. NetworkStream nstream = tclient.GetStream(); // 获取数据流
  11. byte[] mbyet = new byte[ 1024]; //建立缓存
  12. int i = nstream.Read(mbyet, 0, mbyet.Length); //将数据流写入缓存+接收实际收到的信息
  13. message = Encoding.Default.GetString(mbyet, 0, i); //记录发送的消息 转为字符串
  14. }
  15. }

启动计时器,在计时器的Tick事件中判断是否有消息传输。如果有将信息显示在文本框中(窗体抖动的代码在我上一篇博客)


  
  1. [ Obsolete]
  2. private void timer1_Tick(object sender, EventArgs e)
  3. {
  4. if (message != "")
  5. {
  6. string[] strIP = message.Split( new char[ 2] { '(', ')'});
  7. // comboBox1.Items.Add( str[1]); //获取IP名
  8. string Computername= Dns.Resolve(strIP[ 1]).HostName; //获取电脑名
  9. if (!comboBox1.Items.Contains(Computername))
  10. {
  11. comboBox1.Items.Add(Computername); //下拉菜单存储,对方IP的电脑名
  12. }
  13. if (message.Contains( "[抖一抖]"))
  14. {
  15. Shake.Vibration( this) //窗体抖动
  16. }
  17. rtbContent.AppendText(message); //将接受的消息添加到文本框中 追加
  18. rtbContent.ScrollToCaret(); //自动滚动文本框的滚动条
  19. message = ""; //清空消息
  20. }
  21. }

点击“发送按钮”向指定主机发送聊天消息


  
  1. [ Obsolete]
  2. private void button2_Click(object sender, EventArgs e)
  3. {
  4. try
  5. {
  6. #region 发送消息
  7. IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName()); //获取自己主机名
  8. string strmsg = " " + txtName.Text + "(" + ip[ 1].ToString() + ")" + DateTime.Now.ToLongTimeString() + "\n" + "" + this.rtbSend.Text + "\n"; //定义消息格式
  9. TcpClient client = new TcpClient(txtIP.Text, 888); // 创建TCPClient对象
  10. NetworkStream netstream = client.GetStream(); //创建NetworkStream
  11. StreamWriter wstream = new StreamWriter(netstream, Encoding.Default);
  12. wstream.Write(strmsg); //将消息写入网络流
  13. wstream.Flush(); //释放网络流对象
  14. wstream.Close(); //关闭网络流对象
  15. client.Close(); //关闭TCPClient
  16. #endregion
  17. //以上折叠的代码可以封装到一个类中
  18. //string comboitem = comboBox1.Text;
  19. //IPAddress[] nameToIp = Dns.GetHostAddresses(comboitem); //获取主机名;
  20. //string strmsg = Chat.SendMessage(txtName.Text, nameToIp[1].ToString(), rtbSend.Text);
  21. rtbContent.AppendText(strmsg); //将发送的消息添加到文本框
  22. rtbContent.ScrollToCaret(); //自动滚动文本框的滚动条
  23. rtbSend.Clear(); // 清空发送消息文本框
  24. }
  25. catch (Exception ex)
  26. {
  27. MessageBox.Show(ex.Message);
  28. }
  29. }

关闭frmMain窗体,停止网络监听,同时终止消息监听线程


  
  1. private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
  2. {
  3. if ( this.tcpListener1 != null) //判断监听对象是否关闭
  4. {
  5. tcpListener1.Stop(); //停止监听
  6. }
  7. if (td != null) //判断线程是否为空
  8. {
  9. if (td.ThreadState == ThreadState.Running) //判断线程是否正在运行中
  10. {
  11. td.Abort(); //终止线程
  12. }
  13. }
  14. }

如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。

 

转载:https://blog.csdn.net/promsing/article/details/109676076
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场