用socket来写一个聊天软件吧(一)
首先看网络通信的前提:
网络通信还是要基于协议的规范,从一个通信软件到另一个通信软件,要从应用层、传输层、网络层、物理层。IIS服务器上运用到了应用层上http协议,传输层上的tcp协议。聊天软件上以QQ和FQ为代表类型,QQ是一种广域网的聊天软件,它是一种基于面象连接的TCP协议,FQ(飞秋)局域网聊天软件应用到了基于非连接的UDP(登陆广播)和TCP(消息单播文件单传)。
网络连接的宗旨无非要resqust(请求)和response(响应)。连接到哪儿,谁接收?那就要靠IP地址来找到对应的主机(host),发送或请求通信的软件在哪里?那就要看我们的端口来找到它了。
在传输层,遵循那种规范?ipv4,ipv6,传输方式,面象连接TCP还是非连接UDP。
好了,现在不多说了,那就做个简单的类似QQ聊天软件来理解socket内部原理吧。
QQ聊天软件是一个面象连接的软件,它有一个服务器中转站,我们都是用它的客户端。客户端发送消息到服务器,服务器记录下聊天记录并转发给另一个客户端。
首先来理一个思路:
第一步,先实现客户给服务器发消息:
1、创建一个服务端 Server
1.1、在服务器上用一个socket绑定一个端点IPEndPoint(它包含ip地址和商品号)。
1.2、用这个socket在服务器端不断的监听来自客户端的请求,如果接到一个请求就创建一个负责通信的socket 。
1.3、用这个连接的socket收发消息。
2、客户端 Client
2.1、在客户端用一个socket负责和服务器端握手并建立连接连接。
来写代码吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //构建一个负责监听的socket,它有三个枚举类型的参数,分别定义了连接方式、传输流、传输协议,我这里是(ipv4,字节流,面象连接) Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtServer.Text); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); //把一个IP地址和对应的商品绑定到一个socket,监听…… socket.Bind(point); //这里的Listen方法来开始监听,一个规定只能处理一个请求的队列 socket.Listen(10); ShowMsg( "开始监听" );<br> //由于服务器端要不断的要接收来自客户端请求( socket.Accept()),所以要创建一个线程来执行它 Thread th = new Thread(ResMsg); th.IsBackground = true ; //start方法只能传一个object th.Start(socket); //这个方法ResMsg //监听用户 void ResMsg( object o) { //由于要接收多个用户的请求,每来一个用户就创建一个负责连接的socket while ( true ) { Socket socket = o as Socket; Socket consocket = socket.Accept(); string conneip = consocket.RemoteEndPoint.ToString(); ShowMsg( "\r\n" + conneip + "连接成功" ); } } |
客户端
1 2 3 4 5 6 7 8 9 10 11 12 | Thread th; Socket socket; private void List_Load( object sender, EventArgs e) { //创建连接的socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定服务器的ip和端口号 IPAddress ip = IPAddress.Parse( "192.168.1.102" ); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(50000)); //连接 socket.Connect(point); } |
好了,现在客户端就可以连上服务器了,好了,今天就写到这里了,准备睡觉了,明天继续……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?