用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);
 
      }

  

好了,现在客户端就可以连上服务器了,好了,今天就写到这里了,准备睡觉了,明天继续……

posted @   inline  阅读(7609)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

点击右上角即可分享
微信分享提示