你也可以写个聊天程序C#Socket学习腾讯云开发者社区

我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解。我今天就来和大家一起学习下Socket,并写一个简单的聊天程序。

一些基础类

首先我们每天打开浏览器访问网页信息都是使用的HTTP/HTTPS协议,而HTTP是通过的TCP建立的连接。TCP底层又是通过的Socket套接字进行的通信。所以他们之间的抽象关系是:

IPEndPoint、Dns、IPAddress基础作用如下:

//根据DNS获取域名绑定的IPforeach(varaddressinDns.GetHostEntry("www.baidu.com").AddressList){Console.WriteLine($"百度IP:{address}");}//字符串转IP地址IPAddressipAddress=IPAddress.Parse("192.168.1.101");//通过IP和端口构造IPEndPoint对象,用于远程连接//通过IP可以确定一台电脑,通过端口可以确定电脑上的一个程序IPEndPointipEndPoint=newIPEndPoint(ipAddress,80);利用Socket编写聊天程序

我们首先从Socket开始讲起。

要实现Socket通信,先得有个服务端的监听,再有个客户端的连接,然后客户端和服务端就可以通信了。如下:

服务端代码如下

//1创建Socket对象socketServer=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2绑定ip和端口IPAddressip=IPAddress.Parse("127.0.0.1");IPEndPointipEndPoint=newIPEndPoint(ip,50001);socketServer.Bind(ipEndPoint);//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10socketServer.Listen(10);//4、【阻塞】,等待客户端连接SocketnewSocket=socketServer.Accept();//5、【阻塞】,等待读取客户端发送过来的数据byte[]data=newbyte[1024*1024];intreadLeng=newSocket.Receive(data,0,data.Length,SocketFlags.None);//6、读取数据varmsg=Encoding.UTF8.GetString(data,0,readLeng);客户端代码如下

//1创建Socket对象socketClient=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2连接到服务端IPAddressip=IPAddress.Parse("127.0.0.1");IPEndPointipEndPoint=newIPEndPoint(ip,50001);socketClient.Connect(ipEndPoint);//3发送消息到服务端socketClient.Send(Encoding.UTF8.GetBytes("你好,农码一生"));到此,我们就可以开启服务端的服务,并接受客户端的发来的消息了。

不过,这里有个很大的问题,服务端只能建立一个客户端连接和接受一次客户端发来的消息。如果想要连接更多的客户端和接受无数次的消息,服务端代码两处阻塞的地方需要另外开一个线程然后包到循环里面去。

修改后的服务端代码如下:

void....(){//1创建Socket对象socketServer=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2绑定ip和端口IPAddressip=IPAddress.Parse("127.0.0.1");IPEndPointipEndPoint=newIPEndPoint(ip,50001);socketServer.Bind(ipEndPoint);//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10socketServer.Listen(10);//开启新的线程,循环等待新的客户端连接Task.Run(()=>{Accept(socketServer);});}voidAccept(Socketsocket){while(true){//4、【阻塞】,等待客户端连接SocketnewSocket=socket.Accept();//开启新的线程,循环等待接收新的数据Task.Run(()=>{Receive(newSocket);});}}voidReceive(SocketnewSocket){while(true){//5、【阻塞】,等待读取客户端发送过来的数据byte[]data=newbyte[1024*1024];intreadLeng=newSocket.Receive(data,0,data.Length,SocketFlags.None);//6、读取数据varmsg=Encoding.UTF8.GetString(data,0,readLeng);}}到此,服务端就可以接受多个客户端的连接和接收多次客户端发来的消息了。不过我们可能还需客服端能接收服务端发来的消息,这个你可以自己尝试下。文末会提供完整的代码参考。

注意:用Socket来编写聊天软件是长连接,有状态的。不确定服务端什么时候会发送消息过来,我们也可以连续发送消息而不响应。所以,对于消息的接收就需要开一个新的线程循环接收。

而对于HTTP来说,虽然它是也是通过TCP建立的通信,但在数据请求完毕后会马上关闭连接,这个过程很短。每次访问都会建立一个新的连接,是无状态的。

对于浏览器来说是一问一答的形式,先发送请求(Send),然后接收响应(Receive)所以就可以做到不开启新的线程,直接有序的同步的完成。这个在下一篇《模拟浏览器的请求和服务端的响应》会具体分析。

利用TCP编写聊天程序

利用TcpListener、TcpClient来实现同上面相同的功能。

服务端代码

void...(){//1开启监听TcpListenertcpListener=newTcpListener(IPAddress.Parse("127.0.0.1"),9999);tcpListener.Start(10);//最多同时接收10个用户连接//开启一个线程,循环等待客户端的连接Task.Run(()=>{Accept();});}//等待客户端的连接voidAccept(){while(true){//2【阻塞】等待客户端的连接TcpClienttcpClient=tcpListener.AcceptTcpClient();NetworkStreamnetworkStream=tcpClient.GetStream();//开启一个新的线程等待新的消息Task.Run(()=>{Read(networkStream,tcpClient);});}}//接收消息voidRead(NetworkStreamnetworkStream){while(true){byte[]buffer=newbyte[1024*1024];//3【阻塞】等待接收新的消息varreadLen=networkStream.Read(buffer,0,buffer.Length);varmsg=Encoding.UTF8.GetString(buffer,0,readLen);}}客户端代码

//1连接服务端TcpClienttcpClient=newTcpClient();tcpClient.Connect(IPAddress.Parse(textBox1.Text),int.Parse(textBox2.Text));//2发送消息到服务端byte[]buffer=Encoding.UTF8.GetBytes("你好,农码一生");networkStream.Write(buffer,0,buffer.Length);用TcpListener、TcpClient的实现也算ok了,TcpListener代码写的服务端和Socket通信也是完成没问题的,因为他们最后都是Socket。

对此你有觉得比Socket简单和容易理解?其实我更习惯Socket。

注意:

//1、断开连接使用socketClient.Shutdown(SocketShutdown.Both);socketClient.Close();//2、服务端需要判断intreadLeng=newSocket.Receive(data,0,data.Length,SocketFlags.None);if(readLeng==0)//客户端断开连接{//停止会话(禁用Socket上的发送和接收,该方法允许Socket对象一直等待,直到将内部缓冲区的数据发送完为止)newSocket.Shutdown(SocketShutdown.Both);//关闭连接newSocket.Close();//跳出循环return;}

THE END
1.制作聊天软件APP推荐制作聊天软件下载欢迎阅读本篇导语,今天我们将聚焦于制作聊天软件app。在今日快节奏的生活中,聊天软件成为人们交流的重要工具之一。通过制作一款精心设计的聊天软件app,我们可以为用户提供便捷的沟通方式,使他们能够随时随地与亲朋好友保持联系。这款app将具备高效的消息传递功能,同时还能提供丰富多样的表情符号和贴图,使用户能够通过更生动https://www.wandoujia.com/bangdan/556391/
2.哪个app可以p对话框?图片添加对话气泡app小编今天就为大家整理了一些非常好用的聊天对话框手机p图软件,包括有gidpop安卓、bubble icon app、girlscam少女心滤镜免费版、beca berry app、美图聊聊手机版,美图秀秀、funny表情安卓版、巅峰百变聊天气泡手机版、变变微信聊天气泡app、手机qq气泡助手、fork叉子相机安卓app等,让你的对话框能够变得更加亮眼,而且还能http://www.downcc.com/k/duihuakuangapp/
3.微信对话生成器免费版下载微信对话生成器免费版在线最新软件截图 应用简介 微信对话生成器免费版是一款非常好用的虚拟对话截图工具!软件能够帮助自动生成微信聊天对话框,然后进行截图。完全看不出一丝的痕迹,就跟真实的一模一样!对话、转账、红包等等,还能自定义头像、昵称、图片! 微信对话生成器免费版特点 1、要成为粉丝,你还得有梦想。如果这是真的,放松和你的偶https://app.3dmgame.com/android/224618.html
4.程序员必备的16款神器软件,从零基础到精通,收藏这篇就够了!这些软件的强大之处不仅在于能够显著提升开发效率,更能让整个开发流程变得顺畅无阻、便捷无忧。不管你是初出茅庐的新手程序员,还是经验丰富、技艺娴熟的专业开发人员,这些工具都能为你提供极大的帮助。它们可以协助你更出色地组织代码,更精准地调试程序,更高效地管理项目,以及更紧密地与团队成员展开协作。https://blog.csdn.net/leah126/article/details/144411650
5.微信对话生成器,聊天截图生成在线版,自媒体必备神器!衡阳官宣:明年起商品房销售实行套内面积计价! 美国一聊天机器人暗示孩子杀死父母 李铁一审被判20年 演员叶祖新在线求职 61岁男子吃未焯水菠菜后肾衰竭 黑神话悟空输给了宇宙机器人 “王妃”网红集体消失 李佳琦直播佣金曝光 大学生景区当野人日薪100元 中央经济工作会议 定调明年经济工作 1 https://m.163.com/v/video/VNI40RL6S.html
6.数媒在线课堂一个基于C开发的开源的特殊字符输入法数媒在线课堂 一个基于C 开发的、开源的特殊字符输入法 emoji表情在社交网络非常流行,我们在手机也非常方便输入,但是在PC电脑我们一般需要到归集好的网页拷贝,所以今天推荐一个Windows小工具,让你方便输入特殊字符和emoji表情。01 项目简介 这是一个基于C#开发的开源项目,方便我们通过键盘组合键、拷贝的方式来输入https://baijiahao.baidu.com/s?id=1817950360095916103&wfr=spider&for=pc
7.C#聊天软件(包括客户端和服务器端源码)码农集市专业分享IT编程Th**up 上传53.44 KB 文件格式 rar C#聊天软件(包括客户端和服务器端源码) C#聊天软件(包括客户端和服务器端源码),不仅仅是源代码,最重要是有注解.点赞(0) 踩踩(0) 反馈 所需:3 积分 电信网络下载 pythonprj 2024-12-07 12:55:25 积分:1 https://www.coder100.com/index/index/content/id/784596
8.C#编写聊天软件客户端DDWKC#编写聊天软件客户端 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net.Sockets; 10 using System.Net; 11 using System.https://www.cnblogs.com/ddwk/p/8742954.html
9.基于C#聊天软件的设计与开发(音频视频聊天模块).NET计算机本设计的开发采用C/S结构,在基于.NET开发环境下,使用C#编程语言进行本软件的开发。本文首先论述国内外聊天工具的发展情况和现今的发展方向,并对开发环境和开发语言进行了简单介绍;对本设计所要开发的多功能聊天软件作了较为详细的需求分析,并给出了多功能聊天软件的设计方案,主要功能包括文字聊天、文件传输、语音聊天https://www.2bysj.cn/Article/net/201106/3421.html
10.C#完美仿QQ聊天软件MyQQ源代码完整版(源码+数据库+ppt文档C#语言基础 下载此实例 开发语言:C# 实例大小:16.42M 下载次数:66 浏览次数:1016 发布时间:2019-07-02 实例类别:C#语言基础 发布人:艾力江 文件格式:.zip 所需积分:10 相关标签:NET编程vb 网友评论举报投诉收藏该页 同类人气实例 【C#】 modbus通信助手学习 https://www.haolizi.net/example/view_25072.html
11.SuperSocketChat:采用c#SUPERSOCKET开源框架的聊天软件,含服务端成功加入后,服务器会返回当前在线的用户昵称列表,列表显示在左侧 发消息,若选择了用户,则为一对一消息;否则为一对多(群发)消息 简介 采用c#SUPERSOCKET开源框架的聊天软件,含服务端和客户端。 暂无标签 C# 发行版 暂无发行版 贡献者(2) 全部 近期动态 3年多前推送了新的master分支 3年多前创建了仓库https://gitee.com/hewaiming/SuperSocketChat?skip_mobile=true
12.C#MyQQ视频聊天程序(完整源码+文档)电脑版下载软件大小:0.96MB更新时间:2021-01-18应用平台:C#软件分类:源码下载 软件介绍 下载地址 C#写过几个精彩的MYQQ聊天程序,今天带给大家的是支持视频聊天的仿QQ程序。用记使用时先启动聊天服务端,再次启动客户端,并登录到服务端(之前你需要注册一个帐户在本系统内),用户注册成功后,在系统Windows目录下将生成一个serverhttp://www.onlinedown.net/soft/488288.htm
13.电子通讯工具(精选八篇)关键词:即时通讯,SQL Server,C#,Socket,TCP/IP 互联网的发展带动了即时聊天工具的发展, 如:QQ、MSN、阿里旺旺都成为本世纪最流行的通讯工具。但是由于互联网的公用性, 很多企业或者公司出于对自己内部信息的保护性, 会自行开发自己企业或者专用的局域网即时聊天工具, 或者使用别人开发的即时通讯软件。很多小型或者中型https://www.360wenmi.com/f/cnkeyt4f8400.html
14.软件开发脚本开发python开发C#编程vba宏其他工具软件开发杭州市 其他工具软件开发 需求标题 我需要软件开发脚本开发python开发C#编程vba宏 需求描述 我需要本店承接各类软件,桌面软件,脚本,EXCEL VBA, .NET/ C++ / web / C# 软件开发/ php / 微信公众号 / 微信小程序等 程序开发。关于价格:00元是宝贝计价单位,最终价格根据具体需求难度和时间紧急度而定。具体价格https://www.zbj.com/xq/WBdmFqkNZ8SRLkKs.html
15.C#系统软件如何打包。是不是把系统做出来了,他人不要装VS就能够C# 系统软件如何打包。是不是把系统做出来了,他人不要装VS 就能够使用?电源 海盗船 查看全部3条评论回答 写回答 852939637 你需要编译程序,得到可执行文件。然后使用VS自带的打包工具,或者专业的打包软件,如Install Shield、NSIS或者Inno等都可以。另外需要说明的是,你的软件使用的是.NET架构,如果别人的电脑上https://wap.zol.com.cn/ask/details_10816241_4357067_3.html
16.C#网络编程(基本概念和操作)20240328224115.pdf与本文相关的还有一篇文章是:C#编写简单的聊天程序,但这个聊天程序不及本系列 中的聊天程序功能强大,实现方式也不相同。 网络编程基本概念 1.面向连接的传输协议:TCP 对于TCP协议我不想说太多东西,这属于大学课程,又涉及计算机科学,而我不是“学 院派”,对于这部分内容,我觉得作为开发人员,只需要掌握与程序相关的https://max.book118.com/html/2024/0328/5040140004011132.shtm