话不多说,首先给大家看一下整体的运行效果

首先这是登陆界面(艺术细胞不行,不能怪我- -)

这是一个类似QQ主界面的界面(虽然不好看,勉强能用)

然后双击其中一个名字,进入聊天页面,另外在打开一个界面,实现双方的聊天


这就是主要的界面了,还有一些忘记密码,注册,完善个人资料等界面都比较简单,就不一一列出了。所以希望这篇博客能帮助到那些想实现一个比较完整的系统的小伙伴。
接下来就是重头戏了,核心代码了
居所周知,我们做这个聊天系统是采用的C/S模式。首先我们在登陆成功之后,都会进入到主界面,而进入到主界面之后,我们的监听线程就会启动,就相当于启动了一个服务器端。然后我们来看看这个监听线程的代码

public void listen(){Random rd = new Random();int port = 8080;//设置聊天程序的端口号IPAddress ipaddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];//动态的获取你电脑的Ip地址tcplistener = new TcpListener(IPAddress.Any, port);//设置TCP的监听器tcplistener.Start();//监听开始socketforclient = tcplistener.AcceptSocket();//用监听器获取连接进来的套接字if (socketforclient.Connected)//如果有套接字连接了{label1.Text = "收到了消息";networkstream = new NetworkStream(socketforclient);streamreader = new StreamReader(networkstream);streamwriter = new StreamWriter(networkstream);streamreader1 = streamreader;//创建用于传输数据的读写流}}

监听应该用一个线程来启动,所以在窗体的初始化的时候就启动这个线程。

 private void Form2_Load(object sender, EventArgs e){listen1= new Thread(new ThreadStart(listen));listen1.Start();}

到这里,小伙伴们就会问了,哎,每个登陆进来界面的都是服务器端,那么哪个是客户端呢?
这就是本系统的精妙的地方了。细心的你一定会发现主界面有一个好友列表,当你双击好友的名字的时候,你就会以客户端的形式连接到你所点击的人的服务器端,如果他没有登陆,也就是服务器没有开始服务,那么就会有提示消息,你们也就当然无法进行聊天了。
下面就让我们来看看服务器端的核心代码。
同样的,由于双方都进入了聊天页面,双方都必须有一个接收消息的线程。

 recthread1 = new Thread(new ThreadStart(fwrec));recthread1.Start();

然后我们来看看接受消息这个函数

  private void fwrec(){if (form2.socketforclient.Connected){string zhanghao = "";string s = form2.streamreader.ReadLine();for (int i = 0; s[i] != '!'; i++){zhanghao = zhanghao + s[i];}string mysql1;shujuku shujuku2 = new shujuku();OleDbConnection myconn1 = shujuku2.lianjieshujuku();mysql1 = "SELECT 姓名 FROM 好友信息表 WHERE 账号='" + zhanghao + "'";DataSet myds1 = new DataSet();OleDbDataAdapter myda1 = new OleDbDataAdapter(mysql1, myconn1);myda1.Fill(myds1);myconn1.Close();mingzi = myds1.Tables[0].Rows[0]["姓名"].ToString();//这一部分全部都是从数据库中读取数据的,即根据streamreader.ReadLine()读到的账号查找到关于这个好友的一些基本信息,以便于聊天的时候知道是哪个小伙伴发来的消息。如果大家想了解更多关于数据库连接的知识,请留意我的博客string neirong = s.Substring(zhanghao.Length + 1, s.Length - zhanghao.Length - 1);while (neirong!="exit")//除非有一方发送了exit这条消息,否则会一直接受消息{liaotianyemian.Items.Add(DateTime.Now.ToString() + "    " + mingzi);liaotianyemian.Items.Add(neirong);fwrec();}MessageBox.Show(mingzi + "已经结束聊天");form2.networkstream.Close();form2.streamreader.Close();form2.streamwriter.Close();recthread1.Abort();//注意释放资源哦}}

这就是服务器端接收消息的代码了,是不是觉得其实也不是很难。然后我们来看看服务器端发送消息的代码:

private void button1_Click(object sender, EventArgs e){int a = form2.getflag2();//从主界面传过来的参数用于判断是客服端还是服务器端string zhanghao = form1.gettextbox1();string mysql1;shujuku shujuku2 = new shujuku();OleDbConnection myconn1 = shujuku2.lianjieshujuku();mysql1 = "SELECT 姓名 FROM 好友信息表 WHERE 账号='" + zhanghao + "'";DataSet myds1 = new DataSet();OleDbDataAdapter myda1 = new OleDbDataAdapter(mysql1, myconn1);myda1.Fill(myds1);myconn1.Close();mingzi = myds1.Tables[0].Rows[0]["姓名"].ToString();liaotianyemian.Items.Add(DateTime.Now.ToString() + "    " + mingzi);liaotianyemian.Items.Add(textBox1.Text);//也同样的使用了数据库,有兴趣了解数据库知识的童鞋请留意我的博客if (a == 1){form2.streamwriter.WriteLine(form2.form1.gettextbox1() + "!" + textBox1.Text);form2.streamwriter.Flush();if (textBox1.Text == "exit"){form2.networkstream.Close();form2.streamreader.Close();form2.streamwriter.Close();} textBox1.Text = "";}else{streamwriter.WriteLine(form2.form1.gettextbox1() + "!" + textBox1.Text);streamwriter.Flush();if (textBox1.Text == "exit"){shifangziyuan();//释放资源的函数return;}textBox1.Text = "";}}

不知道大家注意到没有,上面的一段代码,获取了一个标志来判断是客户端还是服务器端发送消息,也就是说客户端和服务器端的发送消息都是用的上一段代码。
接下来我们来讲客户端的实现代码了,当我们加载到聊天界面的时候,我们会获得主菜单初始化的一个标志,以此判断我们这个是客户端还是服务器端。当我们发现是客户端的时候,就要运行客户端的代码了

private void kehuduan(){try{IPAddress ipaddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];//获取本机IP地址string mysql;shujuku shujuku1 = new shujuku();OleDbConnection myconn = shujuku1.lianjieshujuku();mysql = "SELECT * FROM 好友信息表 WHERE 姓名='" + form2.getselectnode() + "'";DataSet myds = new DataSet();OleDbDataAdapter myda = new OleDbDataAdapter(mysql, myconn);myda.Fill(myds);myconn.Close();int port = int.Parse(myds.Tables[0].Rows[0]["端口号"].ToString());//获取数据库中的端口号string hostname = Dns.GetHostEntry(ipaddress).HostName;myclient = new TcpClient(hostname, port);//根据参数建立客户端networkStream = myclient.GetStream();streamreader = new StreamReader(networkStream);streamwriter = new StreamWriter(networkStream);recthread = new Thread(new ThreadStart(recvdata));recthread.Start();}catch (Exception ex){MessageBox.Show("该用户没有登录");this.Hide();}

接下里就是客户端的接收消息的代码了,其实跟上面的服务器端的接受消息的代码差别不大

private void recvdata(){string zhanghao = "";string s = streamreader.ReadLine();for (int i = 0; s[i] != '!'; i++){zhanghao = zhanghao + s[i];}string mysql1;shujuku shujuku2 = new shujuku();OleDbConnection myconn1 = shujuku2.lianjieshujuku();mysql1 = "SELECT 姓名 FROM 好友信息表 WHERE 账号='" + zhanghao + "'";DataSet myds1 = new DataSet();OleDbDataAdapter myda1 = new OleDbDataAdapter(mysql1, myconn1);myda1.Fill(myds1);myconn1.Close();mingzi = myds1.Tables[0].Rows[0]["姓名"].ToString();string neirong = s.Substring(zhanghao.Length + 1, s.Length - zhanghao.Length - 1);while (!neirong.Equals("exit")){liaotianyemian.Items.Add(DateTime.Now.ToString() + "    " + mingzi);liaotianyemian.Items.Add(neirong);recvdata();}MessageBox.Show(mingzi + "已经结束聊天了");recthread.Abort();shifangziyuan();}

另外把释放资源的函数留给大家

public void shifangziyuan(){int a=form2.getflag2();if (a == 0){networkStream.Close();streamreader.Close();streamwriter.Close();recthread.Abort();}}

好了!整个步骤大概就介绍到这里了,虽然没有把整个系统所有的代码全部放上来一一介绍。但是最最最重要的代码已经给大家了,小伙伴们可以按照此思路来搭建一个更加完美的系统!
程序源代码:https://download.csdn.net/download/muyuxizi1/10588559
只需一个积分
有问题请联系:826512497

使用C#制作一个完整的聊天系统相关推荐

  1. Android 数据库制作APP,在Android 中使用Anko框架制作一个完整的App,第二集

    作者:feintkotlin(Kotlin学习网) 说明:这次更新对一些小的细节进行了改进,并增加了SQLite的操作.该应用支持6.0及以上android系统 更新:当有网络时,将前5条数据保存到数 ...

  2. 【Unity教程】创建一个完整的驾驶游戏

    专业游戏设计 你会学到什么 在unity HDRP创建一个完整的驾驶游戏 定制不同类型的汽车 将人工智能汽车和人工智能航路点系统添加到你的赛道上 添加汽车展厅菜单以解锁和购买新车 在Blender中设 ...

  3. 【完整代码】用HTML/CSS制作一个美观的个人简介网页

    [完整代码]用HTML/CSS制作一个美观的个人简介网页 整体结构 完整代码 用HTML/CSS制作一个美观的个人简介网页--学习周记1 HELLO!大家好,由于<用HTML/CSS制作一个美观 ...

  4. 微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信

    介绍: DuckChat 是一套完整的私有即时通讯(instant message)解决方案,含服务器端程序.客户端(含 iOS.Android.PC 等)程序.通过 DuckChat,站点管理员可以 ...

  5. 实践,制作一个高扩展、可视化低代码前端,详实、完整

    RxEditor是一款开源企业级可视化低代码前端,目标是可以编辑所有 HTML 基础的组件.比如支持 React.VUE.小程序等,目前仅实现了 React 版. RxEditor运行快照: 项目地址 ...

  6. WPF一个完整的GIF制作工具实例(Part3:生成GIF)

    这里生成GIF文件用的是AnimatedGifEncoder.LZWEncoder.NeuQuant,网上可以找到源码,由于该实例可对每一帧单独修改延时,所以修改了AnimatedGifEncoder ...

  7. 微信小程序|基于小程序+C#制作一个聊天系统

    此文主要基于小程序+C#使用WebSocket制作一个聊天系统,基本实现小程序与服务端的聊天功能.用小程序自带的客服功能只能绑定微信且一对一沟通,接入市面上成熟的即时通讯预算又略显不足,干脆自己开发一 ...

  8. Python:制作一个模拟扔硬币的程序(附完整代码)

    Python:制作一个模拟扔硬币的程序(附完整代码) 在这个项目中,我们将编写一个Python程序来模拟扔硬币的方式.我们会使用Python内置的随机模块,实现随机出现正面或反面的效果. 首先,我们需 ...

  9. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4

    在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...

最新文章

  1. 900万张标注图像,谷歌发布Open Images最新V3版
  2. 服务器系统磁盘,服务器系统重装与磁盘阵列
  3. 微信小程序适配iPhone X
  4. 云信迎来五周年里程碑:日活破3亿,消息量破10000亿
  5. P3648-[APIO2014]序列分割【斜率优化】
  6. 运行android程序时显示stop,Android系统.应用程序关闭时WorkManager是否正在运行?
  7. systemctl命令完全指南
  8. 集成产品开发团队的管理和决策
  9. arduino超声波测距接线图详细_Arduino:超声波传感器+测距
  10. nginx代理安装ssl证书
  11. c语言变量判断中文字符串,用C语言写中文数字字符串转数值变量(国外英语资料).doc...
  12. selenium实现自动播放音乐
  13. 花了一些力气研究aircv,搞一个后台找图识图的DEMO
  14. 苹果微软小米华为,创新四重奏?
  15. SpringMVC(三)——响应
  16. Android 6.0权限请求相关及权限分组
  17. 中间件是什么,常用的中间件有哪些(*)
  18. 【MySQL】 一张表最多支持多少个索引?
  19. Revit各版本下载地址
  20. SecureCRT中文乱码问题完美解决

热门文章

  1. 点光源对焦模糊,将图片导入DP工具,观察PL_STATE
  2. linux 网络带宽测试工具 iperf
  3. 无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
  4. react从零到精通学习路径
  5. sql配置管理器服务是空的_教你搭建一个属于自己的游戏服务器--龙武
  6. 小程序商业化按下快进键,开发者的春天要来了?
  7. Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)
  8. 2022年最新河北水利水电施工安全员模拟试题题库及答案
  9. kafka-27关于高水位和Leader Epoch)
  10. [精品毕设]微信小程序的投票系统问卷调查+后台管理系统