基于Udp(收发信息使用同一个socket)网络通信编程

想要实现网络通信那么就要有一个客户端一个服务器
客户端发送数据,服务器接收数据并返回数据
网络通信就是进程通信
所以我们用两个程序来分别编写客户端和服务器

服务器

1,设置端口号,
2、ip可以固定位127.0.0.1来用于本地测试,但一般不固定,而是让他自己获取本机的ip

3、创建套接字socket
这里的创建只相当于打开网卡文件,设置进去了网络通信的方式(个人理解),就相当于创建了一个文件,返回了他的文件描述符。
在这里插入图片描述
4、
服务器的话要手动把socket文件和网络套接字绑定:
首相要把网络套接字结构填充好(还没有绑定):
在这里插入图片描述
绑定:bind网络系统库调用:
在这里插入图片描述
现在这个服务器程序就有了自己网络通信的套接字(ip port)
5、接收数据:
在这里插入图片描述
6,发送消息,他在接收消息的时候也接收了发消息的那个客户端的套接字,就相当于知道了客户端的ip 和port,那么他就可以把消息发送回客户端
在这里插入图片描述
到这服务器程序就写好了:直接运行服务器:
在这里插入图片描述

客户端

1.客户端想要实现网络通信也要创还能socket文件:
在这里插入图片描述
2、不同的是客户端并不用手动代码把socket文件和字节套网络通信结构体关联,
因为在客户端发送消息的时候,系统会自动分配端口号和ip给他
3、但是他要发送消息就要知道要发送给的那个服务器的套接字(ip port),所以还是需要填写一个套接字结构体来把服务器的 ip port填写进去
以供发送
在这里插入图片描述
4、他也可以接收服务器发来的消息
在这里插入图片描述

到这就基本实现了服务器和客户端网络通信的测试了
详细代码:

Udp_socket

升级版本:多人聊天界面的实现

服务器收到消息后支持多线程发送给多个客户端(线程池),客户端收发信息才用多线程实现(互不干扰),收的时候可以发,发的时候也可以在收。
1、服务器:
创建一个用户列表里面保存着给这个服务器发过消息的客户端信息:方便之后给多个客户端都发消息。只要服务器收到消息就去判断是否要把这个用户插入到列表(用户是否登录过服务器)
在这里插入图片描述
然后把收到的消息,客户端的addr,和服务器自身的socket都打包作为参数,传给我们的进程池,进程池中的线程去竞争锁,然后执行发送任务
在这里插入图片描述需要注意的是收消息的主线程和发消息的线程,他们后悔访问用户列表,所以要把用户列表用锁保护起来

客户端:客户端如果只是单线程的话,在发消息时就不能收信息,所以把客户端改为多线程,主线程负责创建socket,和构建服务器套接字结构,和最后的等待子线程。
然后构建两个子线程,一个负责发,一个负责收,且互不干扰:
在这里插入图片描述
在这里插入图片描述
最终就可以实现,多客户端去访问服务器,然后给服务器发消息,其他发过消息的客户端也能收到。

在这里插入图片描述
这样就实现了多个客户端之间的通信

相关推荐

  1. TCP和udp使用同一个端口通讯

    2024-06-05 19:37:57       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:37:57       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:37:57       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:37:57       82 阅读
  4. Python语言-面向对象

    2024-06-05 19:37:57       91 阅读

热门阅读

  1. 注册windows系统服务

    2024-06-05 19:37:57       26 阅读
  2. [蓝桥杯 2021 省 AB2] 负载均衡

    2024-06-05 19:37:57       26 阅读
  3. 低代码开发:企业OA低成本数字化转型的新引擎

    2024-06-05 19:37:57       29 阅读
  4. Docker - Kafka

    2024-06-05 19:37:57       27 阅读
  5. Ubuntu 22.04 .NET8 程序 环境安装和运行

    2024-06-05 19:37:57       28 阅读
  6. Docker

    2024-06-05 19:37:57       24 阅读
  7. 通过SDKMan来安装各种版本的JDK

    2024-06-05 19:37:57       25 阅读
  8. 【深度学习】contorlnet Pixel Perfect

    2024-06-05 19:37:57       28 阅读
  9. VsCode SSH远程设置不用重复输入密码

    2024-06-05 19:37:57       27 阅读
  10. Lua与Python:深度解析两者之间的核心差异

    2024-06-05 19:37:57       31 阅读
  11. 深入理解Redis事务、事务异常、乐观锁、管道

    2024-06-05 19:37:57       28 阅读
  12. C++模板编程—学习C++类库的编程基础

    2024-06-05 19:37:57       34 阅读
  13. 刷题记录(20240605)

    2024-06-05 19:37:57       32 阅读