互联网时代,怎么能不懂点网络编程?套接字(Sockets)是双向通信信道的端点,本文详细介绍了使用Socket实现类似微信群聊的功能,快进来一起学习下吧!

1.前言

套接字(Sockets)是双向通信信道的端点。套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器。

套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。套接字库提供了处理公共传输的特定类,以及一个用于处理其余部分的通用接口。

1.1 socket模块:

要创建套接字,必须使用套接字模块中的socket.socket()函数,该函数具有一般语法

s = socket.socket (socket_family, socket_type, protocol = 0)

1.2 常用方法

2. 示例1

2.1 服务器端

#sever.py
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 8088
s.bind((host,port))
try:while True:receive_data,addr = s.recvfrom(1024)print("来自服务器" + str(addr) + "的消息:")print(receive_data.decode('utf-8'))msg = input('please input send to msg:')s.sendto(msg.encode('utf-8'),addr)
except:s.close()

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403

2.2 客户端

#client.py
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
try:while True:host = socket.gethostname()port = 8088send_data = input('please input msg:')s.sendto(send_data.encode('utf-8'),(host,port))msg,addr = s.recvfrom(1024)print("来自服务器" + str(addr) + "的消息:")print(msg.decode('utf-8'))
except:s.close()

服务器示例

客户端示例

简易的UDP聊天实现了,下面我们来优化一下示例。

3.示例优化

服务端​​​​​​​

#server.py
import socket
import loggingdef main():s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建socket对象addr = ('127.0.0.1', 9999)s.bind(addr)  # 绑定地址和端口logging.info('UDP Server on %s:%s...', addr[0], addr[1])user = {}  # 存放字典{addr:name}while True:try:data, addr = s.recvfrom(1024)  # 等待接收客户端消息存放在2个变量data和addr里if not addr in user:  # 如果addr不在user字典里则执行以下代码for address in user:  # 从user遍历数据出来addresss.sendto(data + ' 进入聊天室...'.encode('utf-8'), address)  # 发送user字典的data和address到客户端user[addr] = data.decode('utf-8')  # 接收的消息解码成utf-8并存在字典user里,键名定义为addrcontinue  # 如果addr在user字典里,跳过本次循环if 'EXIT'.lower() in data.decode('utf-8'):#如果EXIT在发送的data里name = user[addr]   #user字典addr键对应的值赋值给变量nameuser.pop(addr)      #删除user里的addrfor address in user:    #从user取出addresss.sendto((name + ' 离开了聊天室...').encode(), address)     #发送name和address到客户端else:   print('"%s" from %s:%s' %(data.decode('utf-8'), addr[0], addr[1]))  for address in user:    #从user遍历出addressif address != addr:  #address不等于addr时间执行下面的代码s.sendto(data, address)     #发送data和address到客户端except ConnectionResetError:logging.warning('Someone left unexcept.')if __name__ == '__main__':main()

客户端​​​​​​​

#clinet.py
import socket
import threadingdef recv(sock, addr):'''一个UDP连接在接收消息前必须要让系统知道所占端口也就是需要send一次,否则win下会报错'''sock.sendto(name.encode('utf-8'), addr)while True:data = sock.recv(1024)print(data.decode('utf-8'))def send(sock, addr):'''发送数据的方法参数:sock:定义一个实例化socket对象server:传递的服务器IP和端口'''while True:string = input('')message = name + ' : ' + stringdata = message.encode('utf-8')sock.sendto(data, addr)if string.lower() == 'EXIT'.lower():breakdef main():'''主函数执行方法,通过多线程来实现多个客户端之间的通信'''s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server = ('127.0.0.1', 9999)tr = threading.Thread(target=recv, args=(s, server), daemon=True)ts = threading.Thread(target=send, args=(s, server))tr.start()ts.start()ts.join()s.close()if __name__ == '__main__':print("-----欢迎来到聊天室,退出聊天室请输入'EXIT(不分大小写)'-----")name = input('请输入你的名称:')print('-----------------%s------------------' % name)main()

支持多人的简易聊天室示例,多个客户端通过一个服务器进行之间通信。

在这里还是要推荐下我自己建的Python开发交流学习(qq)群:810735403,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和高级开发教程,欢迎进阶中和想深入Python的小伙伴!

Python 基于 Socket 实现群聊相关推荐

  1. Python基于Socket实现群聊

    作者:huny https://www.cnblogs.com/huny/p/14051152.html 1. 前言 套接字(Sockets)是双向通信信道的端点.套接字可以在一个进程内,在同一机器上 ...

  2. python基于socket进行端口转发实现后门隐藏

    python基于socket进行端口转发实现后门隐藏 思想: 用户正常浏览器访问请求通过8080端口,请求若为http请求,则正常转发到80端口保证网站正常运行.否则转发到8888端口执行系统命令. ...

  3. 基于python实现类似qq群聊功能

    这篇文章主要记录了自己学习python时学习到的使用python来实现类似qq群聊的功能,整个项目分为服务器端和客户端两个部分,具体的实现如下: 一.具体代码 1.服务器端(Server.py) im ...

  4. python小助手_如何用python写个人专属群聊提醒小助手?

    前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...

  5. 4.基于NIO的群聊系统

    [README] 1.本文总结自B站<netty-尚硅谷>,很不错: 2.文末有错误及解决方法: [1]群聊需求 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非 ...

  6. 多线程+socket 实现群聊服务器

    通过多线程+Socket,实现群聊服务器. 服务端: 每当有一个连接时,服务端起一个线程去维护: .将收到的信息转发给所有的客户端: 当某个客户端断开连接时需要处理断开连接 客户端: 接收与发送信息 ...

  7. 用Python打造个性化DIY 群聊机器人,打发你那无处安放的时间。

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:Python进阶者 想要学习Python?有问题得不到第一 ...

  8. 群里又会python的吗_群聊太多?三步教你用 Python 自动监听转发群消息!

    随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间? 因为群质量太低或者群太吵 ...

  9. Python基于socket实现的多任务版TCP服务端

    ''' 基于socket实现的多任务版TCP服务端 ''' import socket import threadingdef client_task(client_socket,ip_port):p ...

最新文章

  1. vmware 共享文件夹(win10下的vmware安装了centos7)
  2. Zebra斑马打印机指令编程进阶(语言通用)--利用指令绘制出图像打印
  3. C++中“引用”的底层实现
  4. Oracle中Null与空字符串' '的区别
  5. 数据结构与算法 Big O 备忘录与现实
  6. 重要的开源资源及50个c/c++源代码网站
  7. Socket编程实践(9) --套接字IO超时设置方法
  8. [Ext JS]5.9 嵌套Grid的实现及注意事项
  9. 利用原生JS将下载链接转换为二维码
  10. Kindle3 字典安装
  11. 台式计算机配置单,最新台式电脑组装配置推荐
  12. 虚拟机ruc_sched Self-detected stall on cpu{4}(t=60001)
  13. 光电耦合器简单介绍以及作用
  14. 【luogu CF1153F】Serval and Bonus Problem(期望)(DP)
  15. XPO:Session管理与缓存--测试篇
  16. easyui支持ie8浏览器
  17. window修改host文件
  18. Mac idea快捷键
  19. 上网痕迹检查 上网痕迹清除 硬盘使用时间 优盘使用时间
  20. Git for Windows 国内镜像文件

热门文章

  1. C语言中的static函数
  2. STM32开源代码——0.96寸OLED显示屏IIC(可显示汉字)
  3. 一起来了解2018中国智能手机市场竞争态势与用户行为数据!
  4. CorelDRAW不同选择工具的作用及用法汇总
  5. 20、Gateway 过滤器
  6. Hadoop——实验七:MapReduce编程实践
  7. oppo reno 10倍变焦版
  8. Tuxedo安装部署升级补丁
  9. 单位给交公积金了,余额20475.48元
  10. 生活-传说中的花语--------全套