python实现多人聊天服务器以及客户端

本文实例为大家分享了python实现多人聊天服务器以及客户端,供大家参考,具体内容如下

所用python的知识点:

网络编程:socket

多线程:threading

图形化编程:tkinter

首先要模拟出一个服务器,以供客户端连接,注意这里的要用死循环,要让服务区一直处于开放的状态

其次要运用多线程,因为多线程共享变量而且可以同时并发的执行操作,否则服务器就只可以连接一个客户端

下面先附上代码后在解释其怎么操作:

第一个py文件--服务器

import tkinter
import socket, threading

win = tkinter.Tk()  # 创建主窗口
win.title('模拟服务器')
win.geometry("400x400+200+20")
users = {}#用户字典,也可以连接数据库

def run(ck, ca):
    userName = ck.recv(1024)#接受客户端发送的信息以1k作为单位这里接受到的信息为byte类型
    users[userName.decode("utf-8")] = ck#解码并储存用户的信息
    #print(users)
    printStr = "" + userName.decode("utf-8") + "连接\n"#在连接显示框中显示是否连接成功
    text.insert(tkinter.INSERT, printStr)

    while True:
        rData = ck.recv(1024)#接受客户端发送的信息以1k作为单位这里接受到的信息为byte类型
        dataStr = rData.decode("utf-8")
        infolist = dataStr.split(":")#分割字符串从而得到所要发送的用户名和客户端所发送的信息
        users[infolist[0]].send((userName.decode("utf-8") + "说" + infolist[1]).encode("utf"))
        #要发送信息的客户端向目标客户端发送信息

def start():
    ipStr = eip.get()#从输入端中获取ip
    portStr = eport.get()#从输入端中获取端口,注意端口取得时候不能被占用(可以取8080,9876,等)
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4或ipv6,和相关协议的
    server.bind((ipStr, int(portStr)))#绑定ip和端口号!!!1:注意输入的端口号是str型而这里的要传入int型
    #2:bind()的参数是一个元组的形式
    server.listen(10)#设置监听,和设置连接的最大的数量
    printStr = "服务器启动成功\n"#,是否连接成功
    text.insert(tkinter.INSERT, printStr)#显示在信息窗口中
    while True:#这里用死循环是因为模拟的服务器要一直运行
        ck, ca = server.accept()#接受所连接的客户端的信息
        # 其中ca是ip和端口号组成的元组,ck有关客户端的信息
        t = threading.Thread(target=run, args=(ck, ca))#每连接一个客户端就开启一个线程
        #其中Thread函数中的传入函数的参数也是以元组的形式
        t.start()#开启线程

def startSever():
    s = threading.Thread(target=start)#启用一个线程开启服务器
    s.start()#开启线程

#下面是关于界面的操作
labelIp = tkinter.Label(win, text='ip').grid(row=0, column=0)
labelPort = tkinter.Label(win, text='port').grid(row=1, column=0)
eip = tkinter.Variable()
eport = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=0, column=1)
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=1, column=1)
button = tkinter.Button(win, text="启动", command=startSever).grid(row=2, column=0)
text = tkinter.Text(win, height=5, width=30)
labeltext = tkinter.Label(win, text='连接消息').grid(row=3, column=0)
text.grid(row=3, column=1)
win.mainloop()

第二个py文件---客户端

import tkinter
import socket
import threading

win = tkinter.Tk()
win.title("客户端2")
win.geometry("400x400+200+20")

ck = None#用于储存客户端的信息

def getInfo():
    while True:
        data = ck.recv(1024)#用于接受服务其发送的信息
        text.insert(tkinter.INSERT, data.decode("utf-8"))#显示在信息框上

def connectServer():
    global ck
    ipStr = eip.get()
    portStr = eport.get()
    userStr = euser.get()
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4或ipv6,和相关协议的
    client.connect((ipStr, int(portStr)))#连接ip和端口号!!!1:注意输入的端口号是str型而这里的要传入int型
    #2:bind()的参数是一个元组的形式
    client.send(userStr.encode("utf-8"))
    ck = client

    t = threading.Thread(target=getInfo)
    t.start()

def sendMail():
    friend = efriend.get()
    sendStr = esend.get()
    sendStr = friend + ":" + sendStr
    ck.send(sendStr.encode("utf-8"))

#下面是界面
labelUse = tkinter.Label(win, text="userName").grid(row=0, column=0)
euser = tkinter.Variable()
entryUser = tkinter.Entry(win, textvariable=euser).grid(row=0, column=1)

labelIp = tkinter.Label(win, text="ip").grid(row=1, column=0)
eip = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=1, column=1)

labelPort = tkinter.Label(win, text="port").grid(row=2, column=0)
eport = tkinter.Variable()

entryPort = tkinter.Entry(win, textvariable=eport).grid(row=2, column=1)

button = tkinter.Button(win, text="启动", command=connectServer).grid(row=3, column=0)
text = tkinter.Text(win, height=5, width=30)
labeltext= tkinter.Label(win, text="显示消息").grid(row=4, column=0)
text.grid(row=4, column=1)

esend = tkinter.Variable()
labelesend = tkinter.Label(win, text="发送的消息").grid(row=5, column=0)
entrySend = tkinter.Entry(win, textvariable=esend).grid(row=5, column=1)

efriend = tkinter.Variable()
labelefriend= tkinter.Label(win, text="发给谁").grid(row=6, column=0)
entryFriend = tkinter.Entry(win, textvariable=efriend).grid(row=6, column=1)

button2 = tkinter.Button(win, text="发送", command=sendMail).grid(row=7, column=0)
win.mainloop()

这里的客户端可以是多个,也就是将第二个py文件复制几分并分别储存在不同的文件中

这里注意:在pycharm中最好在一个项目中打开

1:将第一个文件命名为sever.py然后运行sever.py文件会出现

其中第一行表示你的主机的ipv4地址,如果你用的window,不知道的可以打开cmd后输入ipconfig可以看到你的ipv4地址

第二行表示的是端口,这里最好用大一点8080或9876等,要不就会出现端口占用情况,这里我用9876

最后输入前两行后点击启动

2、将第二个文件多复制遍,分别命名为01.py,02.py......,运行01.py文件

这里第一行输入的是你的用户名,注意可以是任意的字符

第二行输入的是你要连接的服务器的ip这里写你的ip(和上面的ip一样)

第三行输入的是端口注意第一个图上写的端口保持一致上

然后点击启动

然后在运行02.py,重复01.py中的操作但是注意用户名不能相同,二ip和端口号是相同的

如果你想更多的连接更多的客户端可以运行0.3.py重复02.py操作

3、到这里假设你创建了01.py和02.py并运行其中0.1.py中的userName为123,02.py的userName为456并且连个ip和端口号和sever.py中的ip和端口号相同,然后就可以操作两个人的聊天了

打开运行01.py后的界面输入

然后点击发送

然后打开02.py运行后的界面会出现下面的

这样就实现了用python模拟多人聊天服务器以及客户端(带图形化界面)的目标。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现聊天机器人的示例代码

    一.AIML是什么 AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的.AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式. 二.实现第一个聊天机器人 (一)安装Python aiml库 pip install aiml (二)获取alice资源 Python aiml安

  • 基于Python如何使用AIML搭建聊天机器人

    借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的. AIML 是什么? AIML由Richard Wallace发明.他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Comp

  • 教你用Python创建微信聊天机器人

    最近研究微信API,发现个非常好用的python库:wxpy.wxpy基于itchat,使用了 Web 微信的通讯协议,实现了微信登录.收发消息.搜索好友.数据统计等功能. 这里我们就来介绍一下这个库,并在最后实现一个聊天机器人. 有没有很兴奋?有没有很期待? 好了,接下来,开始我们的正题. 准备工作 安装非常简单,从官方源下载安装 pip install -U wxpy 或者从豆瓣源安装 pip install -U wxpy -i "https://pypi.doubanio.com/sim

  • Python QQBot库的QQ聊天机器人

    本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 项目地址:https://github.com/pandolia/qqbot 1.安装 pip install qqbot 2.主动发出消息 from qqbot import _bot as bot # 登录QQ bot.Login(['-q', '2816626661']) ''' buddy 获取指定名称/备注的好友 group 获取群 ''' buddy = bot.List('buddy

  • python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已经不能登录了所以失败,我又试了第二种方法,我试图找到微信界面上的搜索框控件,使用搜索框控件找到想法消息的人,然后发送消息,结果就是又失败了,为啥呢?经过我翻翻翻,找找找,发现微信的界面是使用duilib实现的,界面都是画上去的,控件只是逻辑上存在,而实际没有,我们根本获取不到,然后我只能通过手动移动

  • python实现聊天小程序

    本文实例为大家分享了python实现聊天小程序的具体代码,供大家参考,具体内容如下 我这里实现的是客户端与服务端进行通信的功能,比较简单,与上一篇文章的群聊不太一样. 服务端server.py #-*- coding:utf-8 -*- import socket, traceback, sys host = '' port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_

  • 快速实现基于Python的微信聊天机器人示例代码

    最近听说一个很好玩的图灵机器人api,正好可以用它做一个微信聊天机器人,下面是实现 # test.py import requests import itchat #这是一个用于微信回复的库 KEY = '8edce3ce905a4c1dbb965e6b35c3834d' #这个key可以直接拿来用 # 向api发送请求 def get_response(msg): apiUrl = 'http://www.tuling123.com/openapi/api' data = { 'key' :

  • 使用Python AIML搭建聊天机器人的方法示例

    AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由RichardS. Wallace 博士和Alicebot开源软件组织于1995-2000年间发明创造的.AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式. AIML的设计目标如下: AIML应当为大众所易学易会. AIML应当使最小的概念得以编码使之基于L.I.C.E支持一种刺激-响应学科系统组件. AIML应当兼容XM

  • Python基于Socket实现的简单聊天程序示例

    本文实例讲述了Python基于Socket实现的简单聊天程序.分享给大家供大家参考,具体如下: 需求:SCIENCE 和MOOD两个人软件专业出身,厌倦了大众化的聊天软件,想着自己开发一款简易的聊天软件,满足他们的个性化需求,又不失"专业水准",Talk is easy, try to code it. 技术:socket,详细可参考前文:Python Socket实现简单TCP Server/client功能 语言:python 尽管socket区分服务器和客户端,但是在聊天程序中两

  • python的tkinter布局之简单的聊天窗口实现方法

    本文实例展示了一个python的tkinter布局的简单聊天窗口.分享给大家供大家参考之用.具体方法如下: 该实例展示的是一个简单的聊天窗口,可以实现下方输入聊天内容,点击发送,可以增加到上方聊天记录列表中.现在只是"单机"版. 右侧预留了空位可以放点儿其它东西.感兴趣的读者可以进一步做成socket双方互聊. 以下是功能代码部分: from Tkinter import * import datetime import time root = Tk() root.title(unic

随机推荐