基于Socket的聊天室Python开发

  • 一、Socket简述
  • 二、创建服务端Server
    • 2.1 创建服务端初始化
    • 2.2 监听客户端连接
    • 2.3 处理客户端消息
  • 三、创建客户端Client
    • 3.1 创建服务端初始化
    • 3.2 发送消息
    • 3.3 接收消息
    • 3.3 线程工作
    • 3.4 线程工作
  • 是不是挺好玩的呢?也可以作为课程设计哦!如果需要源码,可以关注我弓中皓查看历史文章。

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

一、Socket简述

SOCKET它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

Socket的主要的工作模式如下:

我们就用上面的模式,来开发一个聊天室工具,主要的开发模块包括两部分:

  1. 客户端开发
  2. 服务端开发

可以部署在同一电脑上,由于我只有一台电脑,所以我将服务端和客户端都部署在了我自己的电脑上。你也可以部署在同一局域网的不同电脑上,或使用其他的不同服务器进行部署,效果展示:

如果你们公司的网络是不允许接入互联网的,那么你可以偷偷做一个局域网内的聊天小软件,用于你跟心爱的女孩子之间聊天。哈哈哈哈。。

二、创建服务端Server

创建服务端的流程大致可以分为以下几个步骤:
1)创建客户端套接字(socket)对象
2)绑定IP地址和端口号
3)设置监听
4)等待接受客户端的连接请求
5)接受数据
6)发送数据
7)关闭客户端套接字(socket)

2.1 创建服务端初始化

该部分主要用于初始化服务端,创建一个Severt类,它不断监听客户端的发送的请求。

class Server:def __init__(self):self.server = socket.socket()    # 创建客户端套接字(socket)对象self.server.bind(("192.168.20.164", 8989))  # 绑定IP地址和端口号self.server.listen(15)     # 设置监听 15表示服务端等待排队连接的最大数量self.clients = []          # 用于存放客户端的响应信息self.clients_name_ip = {}  # 用与存放客户端名称与IPself.get_conn()            # 监听客户端连接

2.2 监听客户端连接

通过设置一个死循环, 让我们的服务端不断处于监听客户端的连接请求。一旦客户端发起一个连接请求,accept()方法会返回当前连接的客户端的socket连接对象和IP地址。
通过 print(cilent),可以看到:

<socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.20.164', 8989), raddr=('192.168.20.164', 59239)>

此时,服务器会向客户端输入一条信息data,服务端需要将该信息编码encode,发送给客户端。同时,客户端接收到该信息后,需要将其节码,才能转为我们可以识别的内容。

def get_conn(self):while True:client, address = self.server.accept()    # 等待接收连接请求print("IP为{}的使用者正在请求连接。".format(address))data = "与服务器链接成功,请输入昵称才可以聊天"client.send(data.encode())   # server与client通信,send() decodeself.clients.append(client)  # 链接用户添加到服务器的用户列表Thread(target=self.get_msg, args=(client, self.clients,self.clients_name_ip, address)).start()

2.3 处理客户端消息

为将发送的名称与IP进行绑定,需要将客户端发送的用户名内容解码,追加到clients_name_ip参数中。此时,一旦客户端发来连接请求,并输入了昵称,那么昵称就会被解码存储在name变量中。

此时,服务端开始循环监听该客户端的消息。并且不断将客户端发来的消息进行解码。并将消息通过for循环的形式,重新编码发送给所有的客户端。

另外,如果检测到客户端发来的消息是一个"Q"字符,那么客户端就会被关闭。

def get_msg(self, client, clients, clients_name_ip, address):name = client.recv(1024).decode()  # 接受客户端发来的昵称print("昵称:【{}】 设置成功".format(name))clients_name_ip[address] = name    # 昵称与IP进行绑定while True:                        # 循环监听客户端消息try:recv_data = client.recv(1024).decode()except Exception as e:self.close_client(client, address)break# 入=如果用户输入Q,推出if recv_data.upper() == "Q":self.close_client(client, address)breakfor c in clients:c.send((clients_name_ip[address] + " " + time.strftime("%x")+"\n"+recv_data).encode())

三、创建客户端Client

创建客户端的流程大致可以分为以下几个步骤:
1)创建客户端套接字(socket)对象
2)和服务器端套接字(socket)建立连接
3)发送数据
4)接受数据
5)关闭客户端套接字(socket)

3.1 创建服务端初始化

客户端采用PyQT5,将客户端做成界面的形式进行交互。这里不对PyQT5做过多的解释。此处讲解使用的PyQT5比较简单,重点对服务端socket开发进行讲解。

首先,创建客户端socket对象,并连接服务器端口,并开启工作线程。

class Client(QWidget):def __init__(self):super(Client, self).__init__()self.setGeometry(600, 300, 360, 300)self.setWindowTitle("聊天室")self.add_ui()   # 界面UI,这个跟socket无关self.client = socket.socket()  # 与服务器链接self.client.connect(("127.0.0.1", 8989))self.work_thread()        # 调用线程

3.2 发送消息

发送消息通过的是用户点击发送按钮,点击发送按钮以后,QT会以信号的形式触发执行send_msg函数。至此,消息会被解码发送给服务器,如果检测到发送消息是字符‘Q’,那么客户端会被退出。

def btn_send(self):   # 发送按钮点击,信号发射self.button.clicked.connect(self.send_msg)
def send_msg(self):   # 检测到发送按钮点击,该客户端就会向服务端发送数据msg = self.message.text()self.client.send(msg.encode())if msg.upper() == "Q":self.client.close()self.destroy()self.message.clear()

3.3 接收消息

通过接收消息,将接收后的消息解码,通过append的形式追加到QT的控件中,用于在界面中显示

def recv_msg(self):while True:try:data = self.client.recv(1024).decode()print(data)data = data + "\n"self.content.append(data)except:exit()

3.3 线程工作

通过调用该方法,来启动发送消息线程、接收消息线程。


def work_thread(self):Thread(target=self.btn_send).start()   # 发送消息Thread(target=self.recv_msg).start()

3.4 线程工作

第一步:启动服务器Server
第二步:启动一个Client (pycharm)
第三步:再启动一个Client (cmd)

是不是挺好玩的呢?也可以作为课程设计哦!如果需要源码,可以关注我弓中皓查看历史文章。

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

【python】基于Socket的聊天室Python开发相关推荐

  1. Android 基于Socket的聊天室

    原文地址为: Android 基于Socket的聊天室 Socket是TCP/IP协议上的一种通信,在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路, ...

  2. 基于socket的聊天室实现原理

    基于socket的聊天室,目前还比较少见,国内比较知名的有网易和碧海银沙聊天室.这种聊天室的特点很明显,不象CGI聊天室那样不管有没有人发言,都会定时刷新.而是当有人发言时,屏幕上才会出现新聊天内容, ...

  3. Python语言基于Socket实现聊天室(包含登录、注册功能)

    一.聊天室的整体架构 1.twisted:实现服务端,以及事件驱动 Twisted是用Python实现的基于事件驱动的网络引擎框架. 2.socket:实现客户端,以及事件驱动 3.tkinter:实 ...

  4. python多线程+socket实现聊天室(最终版)

    文章目录 一. 成果预览 二.源码分享 总结 gif动图中的内容bug已被修改,如下项目结构是最新版本内容,代码已更新 一. 成果预览 二.源码分享 目录结构 main.py from src imp ...

  5. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  6. 基于python面向对象多人聊天室

    基于python面向对象多人聊天室 1.项目环境 项目名称:多人聊天室 项目模式:C/S 开发环境:win10+python3.8+pycharm 所需知识:python GUI编程,多线程编程,网络 ...

  7. 基于Python的多人聊天室的设计与实现

    基于Python的多人聊天室的设计与实现 摘要  本文介绍了基于即时通讯的Python实现web版多人聊天室的设计和实现.这个系统利用了多种先进的技术,如Django.Channels.WebSock ...

  8. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  9. Python基于AIML智能聊天机器人实战(4)- 机器人自学习能力集成

    一.前言 本文是<Python基于AIML智能聊天机器人实战>第四篇:AIML自学习能力集成: AIML是智能对话机器人具有里程碑意义的开源项目,曾斩获多项国际大奖,是基于检索技术的闲聊式 ...

最新文章

  1. 新视界,你好!_只愿与一人十指紧扣_新浪博客
  2. 收藏!一篇文章搞懂项目管理
  3. 使用花生壳自己架设网站:路由器后
  4. 中石油训练赛 - 小A进学校(唯一分解定理)
  5. 一种替代的多生产者方法
  6. Spring MVC:带有CNVR卷的REST应用程序。 3
  7. java课程设计实验报告_javaweb课程设计实验报告
  8. Vue 项目结构介绍
  9. three.js glb 多个_奔驰GLB外观完美!内饰酷炫!动力倍儿棒
  10. 我愿意为你在城里的月光下温暖冷冷的爱情
  11. Hash算法原理的简单分析
  12. python 美化输出_如何让Python输出更漂亮:PrettyPrinter美化打印包使用手册
  13. linux更新字体库失败,wps for linux 字体库缺失问题的解决办法
  14. 用计算机三角函数公式,电脑是通过什么公式计算出三角函数的?
  15. 计算机if函数自动填充,Excel表格函数怎么能实现自动填充-excel填充函数,excel表格根据公式自动填充...
  16. 尺寸链计算-尺寸公差分析-的国产化之路
  17. 介绍一下大型企业数据防泄密产品选型的思路
  18. Bootstrap实战练习---Web全栈课程体系(表格+巨幕)
  19. (附源码)Springboot 点餐系统 毕业设计 100908
  20. 华为5G的秘密原来掌握在一个土耳其人的手中?!

热门文章

  1. java随机数生成a到z_Java 随机数的产生
  2. selenium2 java第一个自动化测试程序
  3. MySql数据库——文件
  4. 使用DrawIcon绘制图标时大小
  5. ubuntu设置.ttf和.otf字体
  6. 迅雷PK用户,到底谁更流氓?
  7. stm8程序无法写入c语言,STM8问题汇总
  8. 条件概率、边缘概率、联合概率的简单理解
  9. cadance学习笔记(1)---常用器件,更改图纸尺寸
  10. php 404页面设置,thinkphp框架下404页面设置 仅三步