Python基于Socket实现简易多人聊天室的示例代码


Posted in Python onNovember 29, 2020

前言

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

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

socket模块:

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

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

参数 描述
socket_family 它的值可以是:AF_UNIX或AF_INET,如前所述。
socket_type 它的值可以是:SOCK_STREAM或SOCK_DGRAM。
protocol 这通常被省略,默认为0。

常用方法:

序号 方法 描述
1 s.bind() 此方法将地址(主机名,端口号对)绑定到套接字。
2 s.recvfrom() 此方法接收UDP消息,返回值是一对(字节, 地址) ,其中字节是代表接收到的数据的字节对象,而地址是发送数据的套接字的地址
3 s.sendto() 此方法发送UDP消息,将数据发送到套接字。该套接字不应连接到远程套接字,因为目标套接字是由address指定的
4 s.close() 此方法关闭套接字,套接字对象上所有以后的操作都将失败。远端将不再接收任何数据(在清除排队的数据之后)。套接字在被垃圾回收时会自动关闭
5 socket.gethostname() 返回主机名,返回一个字符串,其中包含当前正在执行Python解释器的计算机的主机名。

示例1

服务器端

#sever.py
import socket

s = 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()

客户端

#client.py
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
try:
  while True:
    host = socket.gethostname()
    port = 8088
    send_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()

服务端示例

Python基于Socket实现简易多人聊天室的示例代码

客户端示例

Python基于Socket实现简易多人聊天室的示例代码

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

示例2

服务端:

#server.py
import socket
import logging

def 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遍历数据出来address
          s.sendto(data + ' 进入聊天室...'.encode('utf-8'), address) # 发送user字典的data和address到客户端
        user[addr] = data.decode('utf-8') # 接收的消息解码成utf-8并存在字典user里,键名定义为addr
        continue # 如果addr在user字典里,跳过本次循环

      if 'EXIT'.lower() in data.decode('utf-8'):#如果EXIT在发送的data里
        name = user[addr]  #user字典addr键对应的值赋值给变量name
        user.pop(addr)   #删除user里的addr
        for address in user:  #从user取出address
          s.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遍历出address
          if 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 threading

def 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 + ' : ' + string
    data = message.encode('utf-8')
    sock.sendto(data, addr)
    if string.lower() == 'EXIT'.lower():
      break

def 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基于Socket实现简易多人聊天室的示例代码 

Python基于Socket实现简易多人聊天室的示例代码 

Python基于Socket实现简易多人聊天室的示例代码 

Python基于Socket实现简易多人聊天室的示例代码

到此这篇关于Python基于Socket实现简易多人聊天室的示例代码的文章就介绍到这了,更多相关Python Socket多人聊天室内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python常用的日期时间处理方法示例
Feb 08 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
python实现下载文件的三种方法
Feb 09 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
numpy.random模块用法总结
May 27 Python
Djang的model创建的字段和参数详解
Jul 27 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
python中for in的用法详解
Apr 17 Python
python利用后缀表达式实现计算器功能
Feb 22 Python
python3实现飞机大战
Nov 29 #Python
python之pygame模块实现飞机大战完整代码
Nov 29 #Python
Python使用Pygame绘制时钟
Nov 29 #Python
详解pandas赋值失败问题解决
Nov 29 #Python
python 获取剪切板内容的两种方法
Nov 28 #Python
快速创建python 虚拟环境
Nov 28 #Python
Python基于Webhook实现github自动化部署
Nov 28 #Python
You might like
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP实现的日历功能示例
2018/09/01 PHP
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python文件操作基本流程代码实例
2017/12/11 Python
分分钟入门python语言
2018/03/20 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python实现八皇后问题示例代码
2018/12/09 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
竞选部门副经理的自荐书范文
2014/02/11 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
数学教师个人工作总结
2015/02/06 职场文书
欠款起诉书范文
2015/05/19 职场文书
行政答辩状范文
2015/05/21 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript