你也可以写个聊天程序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.VoceChat一款即时聊天应用如果你想搞一套自己的聊天应用,可以试试这款可自部署的轻量级聊天系统:VoceChat VoceChat 具备的功能特性 开源+ 自部署:意味着代码 + 数据完全自主,甚至可以做二次开发 全平台:一旦部署成功,既可以通过 WebAPP 使用,也可以通过手机 APP 使用 即时聊天 + 频道:既可以同某个人即时聊天,也可以建立一个主题频道群聊https://zhuanlan.zhihu.com/p/688009282
2.C#开发视频聊天软件实现的功能和QQ的视频聊天差不多。在网上看到有用VC做的视频会议系统。 如果用C#做,需要添加哪些控件,如何建类等,刚毕业,初识C#,对开发流程不是很清楚,搬个板凳一直等。如果能有源码更好。给本帖投票 1494 19 打赏 收藏 分享 转发到动态 举报 写回复https://bbs.csdn.net/topics/70497706/forums/WindowsMobile
3.基于C#聊天软件的设计与开发(音频视频聊天模块).NET计算机本设计的开发采用C/S结构,在基于.NET开发环境下,使用C#编程语言进行本软件的开发。本文首先论述国内外聊天工具的发展情况和现今的发展方向,并对开发环境和开发语言进行了简单介绍;对本设计所要开发的多功能聊天软件作了较为详细的需求分析,并给出了多功能聊天软件的设计方案,主要功能包括文字聊天、文件传输、语音聊天https://www.2bysj.cn/Article/net/201106/3421.html
4.电子通讯工具(精选八篇)互联网的发展带动了即时聊天工具的发展, 如:QQ、MSN、阿里旺旺都成为本世纪最流行的通讯工具。但是由于互联网的公用性, 很多企业或者公司出于对自己内部信息的保护性, 会自行开发自己企业或者专用的局域网即时聊天工具, 或者使用别人开发的即时通讯软件。很多小型或者中型企业使用起来不方便, 本文是基于C#开发的一款即时https://www.360wenmi.com/f/cnkeyt4f8400.html
5.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
6.软件开发脚本开发python开发C#编程vba宏其他工具软件开发杭州市 其他工具软件开发 需求标题 我需要软件开发脚本开发python开发C#编程vba宏 需求描述 我需要本店承接各类软件,桌面软件,脚本,EXCEL VBA, .NET/ C++ / web / C# 软件开发/ php / 微信公众号 / 微信小程序等 程序开发。关于价格:00元是宝贝计价单位,最终价格根据具体需求难度和时间紧急度而定。具体价格https://www.zbj.com/xq/WBdmFqkNZ8SRLkKs.html
7.2020年整理C#开发视频教程(91.3GB)百度网盘资源下载实战教程021—C#上位机开发串口通信编程.rar3.9GB 实战教程020—winform项目之Wifi热点软件开发.zip322.9MB 实战教程019—C#.NET串口通信及测控应用典型实例.zip3.4GB 实战教程018—C#.NET串口通信视频教程.zip5.7GB 实战教程017—C#和Unity游戏开发教程.zip6.0GB https://www.iizhi.cn/resource/detail/cbaf8e5c5b037484815a2ecab6108140
8.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
9.国思软件国思软件是一家综合的框架应用开发商,12+年专注于该领域的研发,为企业提供互联网+一体化信息解决方案与落地工具,旨在为广大中小企业提供一套低成本的企业应用搭建解决方案。提供快速开发平台、快速开发框架、低代码开发平台、低代码开发框架、0代码开发平台、0代码开发框架http://rdiframework.net/
10.android聊天软件服务器华为云帮助中心为你分享云计算行业信息,包含产品介绍、用户指南、开发指南、最佳实践和常见问题等文档,方便快速查找定位问题与能力成长,并提供相关资料和解决方案。本页面关键词:android聊天软件 服务器。https://support.huaweicloud.com/topic/1212102-5-A
11.SuperSocketChat:采用c#SUPERSOCKET开源框架的聊天软件,含服务端成功加入后,服务器会返回当前在线的用户昵称列表,列表显示在左侧 发消息,若选择了用户,则为一对一消息;否则为一对多(群发)消息 简介 采用c#SUPERSOCKET开源框架的聊天软件,含服务端和客户端。 暂无标签 C# 发行版 暂无发行版 贡献者(2) 全部 近期动态 3年多前推送了新的master分支 3年多前创建了仓库https://gitee.com/hewaiming/SuperSocketChat?skip_mobile=true
12.C#MyQQ视频聊天程序(完整源码+文档)电脑版下载软件介绍 下载地址 C#写过几个精彩的MYQQ聊天程序,今天带给大家的是支持视频聊天的仿QQ程序。用记使用时先启动聊天服务端,再次启动客户端,并登录到服务端(之前你需要注册一个帐户在本系统内),用户注册成功后,在系统Windows目录下将生成一个server.ini文件,该文件记录了用户注册的相关信息,如果想要重新注册,必须将该http://www.onlinedown.net/soft/488288.htm
13.c#开发的聊天软件初始版本qiurideyunc#开发的聊天软件-初始版本 自己写了个很小的c#聊天软件,很多功能未实现,代码需要重写,还有很多bug,先发个初始的,要的话,留下邮箱,我会发送的https://www.cnblogs.com/qiurideyun/archive/2012/09/01/2666387.html