1.UDP简介

Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP)。UDP为应用程序提供了无需建立就可以发送封装的IP数据包的方法。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

Internet的传输层有两个协议,互为补充。无连接是UDP,它除了给应用程序发送数据包功能并允许他们所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是TCP,该协议几乎做了所有的事情。

中文名:用户数据协议

外文名:User Datagram Protocol

特点:无连接、不可靠、快速传输

基础:IP数据包服务上增加一点功能

类别:传输层协议

用途:发送数据包

2.socket

一般socket我们称为套接字,并且在Python中有socket这个库(可以使用pip命令自行下载pip install socket)。下面来说一下socket的简单流程:

1. 获取套接字
2. 绑定端口
3. 选择发送或者接受
4. 关闭套接字

2-1 socket的发送

socket的发送很简单,下面是一般的最简代码:

# -*- coding: utf-8 -*-
import socketdef sendMsg():# 获取套接字send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 为套接字绑定端口与ip# 这里的""是表示当前绑定的ip为本机的ip,后面的数字为该程序所绑定的端口号。# 如果不提前绑定端口号,则可能发送的时候,有电脑自动为该程序分发一个端口号。send_socket.bind(("", 7879))  # 当然这个端口也可以是7878,即发送的端口,后续会继续讲解 # 设置发送send_socket.sendto(b"123", ("127.0.0.1", 7878))# 关闭套接字send_socket.close()if __name__ == '__main__':sendMsg()

2-2 socket的接收

注意,在recv中,一定需要提前绑定端口,因为这是接收消息的前提条件,那么选用什么端口呢?一般做实验或者写程序的时候,我们可以选择的端口范围在[1024-65535]之间。因为上面已经创建了socket的发送,并且选定了端口号为7878,那么我们此时的端口只需要绑定7878即可。

recv_socket.recvfrom(1024)表示单次接受的最大字节为1024,如果超出这个数值,那么只取前面的1024个。并且该函数返回的值是一个元组,与socket发送时一致(b"123", ("127.0.0.1", 7878)),因此在想要获取接受的内容是,需要利用下标索引。这里还需要注意一点,因为我们在传输的时候是靠字节去传输的,因此获取到的也是字节,我们需要为它进行编码,但是win系统与linux系统是不相同的,win系统默认的是gbk编码,但是linux默认的是utf-8编码,因此在获取字节之后,需要根据系统的类型选择相应的解码格式。

# -*- coding: utf-8 -*-
import socketdef recvMsg():# 创建套接字recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口recv_socket.bind(("", 7878))# 接收字节recv_data = recv_socket.recvfrom(1024)  # 这里的数字表示单次接受的最大字节数# 转化打印出内容print("接收到来自{},的{}信息".format(recv_data[1],recv_data[0].decode("gbk")))# 关闭套接字recv_socket.close()if __name__ == '__main__':recvMsg()

3.实现收发功能

​    我们需要提前了解一些知识点:单工:只能收或者发、半双工:可以收也可以发,但是不能同时运行、全双工:同一时刻既可以收也可以发。并且socket是支持同时接收与发送数据的,因此socket是全双工的。

​    下面代码是实现socket的发送与接收功能

# -*- coding: utf-8 -*-
import socketdef SendAndRecv():"""套接字是可以同时收发数据的单工:只能收或者发半双工:可以收也可以发,但是不能同时运行全双工:同一时刻既可以收也可以发注意:socket是全双工"""# 获取套接字udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口(也可以不绑定,只需要查看发送时的端口号,在重新输入即可,但是这个程序最好提前绑定端口udp_socket.bind(("", 7789))# 发送对方信息udp_socket.sendto(b"hahahah", ("127.0.0.1", 7788))# 接收对方返回的信息,如果没有收到字符,则会阻塞,直到有信息返回recv_data = udp_socket.recvfrom(1024)# 转化打印出内容print("接收到来自{},的{}信息".format(recv_data[1], recv_data[0].decode("gbk")))# 关闭套接字udp_socket.close()if __name__ == '__main__':SendAndRecv()

上面代码的确看起来有点“丑陋”我们来给他进行一些封装

# -*- coding: utf-8 -*-
import socketdef send_msg(udp_socket):"""发送消息"""udp_socket.sendto(b'124124', ("127.0.0.1", 7788))def recv_msg(udp_socket):"""接收数据"""recv_data = udp_socket.recvfrom(1024)print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("gbk")))  # 如果是win系统通信,需要把deckde的解码格式改为gbk,但是在linux中可以为utf-8def main():# 创建套接字udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口udp_socket.bind(("", 7789))# 循环来处理事情while True:print("------DreamsPy聊天器------")print("1:发送消息")print("2:接收消息")print("0:退出系统")op = input("请输入功能:")if op == "1":# 发送send_msg(udp_socket)elif op == "2":# 接收数据并显示recv_msg(udp_socket)elif op == "0":breakelse:print("您输入的命令有误,请重新输入")if __name__ == '__main__':main()

以上代码实现了程序的接受和发送。但是我们需要写两个程序来验证是否能执行吧,以下两个就是发送的检测代码和接收的检测代码。

# -*- coding: utf-8 -*-
import socketdef recvMsg():# 创建套接字recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口recv_socket.bind(("", 7788))# 接收字节recv_data = recv_socket.recvfrom(1024)  # 这里的数字表示单次接受的最大字节数# 转化打印出内容print("接收到来自{},的{}信息".format(recv_data[1],recv_data[0].decode("gbk")))# 关闭套接字recv_socket.close()if __name__ == '__main__':recvMsg()

上面的代码是主程序接收是否能实现。

# -*- coding: utf-8 -*-
import socketdef sendMsg():# 获取套接字send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 设置发送send_socket.sendto(b"123", ("127.0.0.1", 7789))# 关闭套接字send_socket.close()if __name__ == '__main__':sendMsg()

上面的代码是主程序发送是否能实现。

当然为了严谨,同样可以在main函数里加上while True进行无限循环来验证,并且可以用户手动输入需要发送的ip地址、端口号、发送内容。这里就不一一写出来了,剩下的就留给大家了。

以上就是python利用socket写的聊天小程序。思路比较简单,代码也比较容易上手。tcp也是重点(后续会发),多多复习多多练习哟。

用python写一个聊天小程序!和女朋友的专属聊天工具!相关推荐

  1. 用python写一个抽奖小程序_微信小程序抽奖助手一键参与抽奖

    写在前头的话 最近"沉迷"于微信一款小程序,就是抽奖助手.反正这个抽奖几乎不用什么成本, 就是一个个抽奖活动点进去点击参与抽奖比较麻烦.要是如果有个程序一键解决这些步骤,那就是零成 ...

  2. 用python写一个记账小程序_python实现日常记账本小程序

    python实现收支的自动计算,能够查询每笔账款的消费详情,具体内容如下 1.函数需要两个文件:一个类似钱包功能,存放钱:另一个用于记录每笔花销的用途 #!/usr/bin/env python im ...

  3. python编写木马攻击_用Python写一个自动木马程序

    电脑作为大家日常办公的工具,最怕的一件事情之一就是被偷,当我们的电脑被盗的时候,不仅仅是电脑本身,更重要的是电脑存储的资料都会丢失.如何尽快的找回电脑需要我们想点办法,今天就教大家一个好的技巧,虽说不 ...

  4. 手把手教你写一个微信小程序日历组件

    今天我们一起写一个微信小程序日历组件 微信小程序日历组件 github.com/749264345/w- 好,我们先看一下要实现的模样,如下图 由以上截图我们可以看到 1.日历可以通过按钮[切换展示效 ...

  5. 用JAVA写一个画图小程序(JAVA 大作业)

    第一次写博客 且是稍微大点的程序 看看就行 重新写的在这,更加清晰明了:点击进入:用JAVA写一个画图小程序(JAVA 大作业)重排版本 设计思路 首先我直接去了Windows自带画图程序去实践模拟, ...

  6. 微信小程序+PHP 从零写一个微信小程序

    微信小程序是越来越火,参与其中的开发者也越来越多,但是很多朋友都是只懂小程序前端开发,或者是只懂 PHP 开发,本 Chat 就是想让这部分人能够自己一个人把前后端串起来,做一个专属自己的微信小程序. ...

  7. 用python编写一个爱心小程序

    无聊时写了一个爱心小程序,自己编写了一个相对简单点的,当然还可以添加其它的内容,比如文字什么的. 最终得到的图案 代码如下: import turtle import random p = turtl ...

  8. python写小程序-用python编写一个闹钟小程序

    今天看到了一个闹钟的视频,于是想到了不如自己也编写一个.让我们先来理一下思路,界面用tkinter编辑,主要是其他的GUI也没用过,datetime获取本地时间...... 1.好的,思路理完了,让我 ...

  9. python俄罗斯方块小游戏实验报告,童年的记忆——如何用python写一个俄罗斯方块小游戏!...

    谈到记忆里的小游戏,俄罗斯方块是大家一定会想到的一款游戏,自己写出来的应该玩起来更有感觉,然后就写了一个俄罗斯方块的游戏 给大家分享一下这个游戏的源码 先用python创建一个py文件 定义这次程序所 ...

  10. python编的俄罗斯方块游戏下载_用python写一个俄罗斯方块小游戏

    相信大家都玩过俄罗斯方块吧,应该是小时候的回忆吧,但是想不想了解一下这个程序是怎么写出来的呢,自己写出来的应该玩起来更有感觉吧! 感觉还是蛮好玩吧! 接下来,我就分享一下这个游戏的源码过程啊! 先用p ...

最新文章

  1. a java runtime envi_认识java
  2. 基层数字化治理困境如何破局?
  3. HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
  4. c语言while找rn,STM32Fatfs遍历文件(C语言实现)
  5. Python3 配置文件(configparser)(转载)
  6. Linux文件系统构成
  7. 20%3cx 30 的c语言表达式是,判断题(指令正误)
  8. 4.3 createjs
  9. 获得周公解梦数据接口java_周公解梦接口调用示例
  10. Spring Security(二) UserDetailsService 和 PasswordEncoder 密码解析器 详解
  11. 如何在html中在线编辑word文档,怎样用word文档编辑网页
  12. 原生JS制作网页中的倒计时效果
  13. 乐理基础-十二平均律,三分损益法,五度相生法
  14. 【USB笔记】设备功能描述符Device Capability Descriptor
  15. Hastelloy C22合金板材 圆钢 无缝管
  16. 【亲测有效】解决 Ubuntu 虚拟机无法共享文件夹的问题
  17. Windows 文件夹 显示svg缩略图
  18. 批发进销存管理软件,商品分类管理,对商品分类批量价格管理,商品分类导入导出的操作
  19. 一英寸芯片大小_CCD芯片尺寸
  20. 深入解析ThreadLocal源码

热门文章

  1. CogImageConvertTool工具 图像处理工具
  2. spring5高级编程_我也来推荐一波你看了以后大呼过瘾的编程书
  3. 锤子便签的Monkeyrunner 测试脚本
  4. 【亲身实践已解决】Windows无法启动MongoDB Server,错误:1053:服务没有及时响应启动或控制请求
  5. vue实现图片3D旋转效果
  6. ThinkPad win7 鼠标自动点击错误
  7. [矩阵论]任意n阶矩阵都可以相似成一个三角矩阵
  8. 为什么要给宝宝读绘本(宝宝需要读绘本么?什么时候开始读?)
  9. 【Go学习】实现一个用其他终端远程控制电脑鼠标的小程序
  10. 解决web项目发布新版本需要清除浏览器缓存的问题