网络编程:模拟QQ发送消息
可以参考上一篇博客:https://blog.csdn.net/qq_36171287/article/details/95670584
里面有客户端与服务器之间信息传输
这是模拟QQ的消息发送功能制作的、
其中的client和client1,client2代码一样,都是一个客户端,客户端之间通过server服务器来进行消息的互相传递
python的创建的server服务器代码:
import socket
import threading
import tkinter
win = tkinter.Tk()
win.title("QQ Server")
win.geometry("500x500")
#账号
users = {}
def run(ck,ca):
username = ck.recv(1024)
users[username.decode("utf-8")] = ck
print(users)
while True:
rData = ck.recv(1024)
dataStr = rData.decode("utf-8")
infolist = dataStr.split(":")
users[infolist[0]].send((username.decode('utf-8')+"说:"+infolist[1]+"\n").encode('utf-8'))
# printStr = username + "链接"
# text.insert(tkinter.END,printStr)
def start():
ipStr = eip.get()
portStr = eport.get()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP端口
server.bind((ipStr, int(portStr)))
# 监听
server.listen(10)
printStr = '服务器启动成功......'
text.insert(tkinter.INSERT, printStr)
while True:
# 等待链接
clientSocket, clientAddress = server.accept()
print("%s---%s 连接成功" % (str(clientSocket), (clientAddress)))
t = threading.Thread(target=run, args=(clientSocket, clientAddress))
t.start()
#定义方法
def startSrever():
s = threading.Thread(target=start)
s.start()
labelIp = tkinter.Label(win,text = "ip",font=("黑体",10)).grid(row=0,column = 0)
labelPort = tkinter.Label(win,text = "port",font=("黑体",10)).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=startSrever).grid(row=2,column = 0)
text = tkinter.Text(win,width=30,height = 10)
text.grid(row=3,column = 0)
win.mainloop()
python的client代码:
import socket
import threading
import tkinter
win = tkinter.Tk()
win.title("QQ 客户端")
win.geometry("500x500")
ck = None
def getInfo():
while True:
data = ck.recv(1024)
text.insert(tkinter.INSERT, data.decode('utf-8'))
def connectSrever():
global ck
ipStr = eip.get()
portStr = eport.get()
userStr = euser.get()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((ipStr, int(portStr)))
client.send(userStr.encode('utf-8'))
ck = client
#等待接收数据
t = threading.Thread(target=getInfo)
t.start()
def sendMail():
sendstr = eSend.get()
friend = efriend.get()
sendStr = friend + ":" + sendstr
ck.send(sendStr.encode('utf-8'))
labelUser = tkinter.Label(win,text = "UserName",font=("黑体",10)).grid(row=0,column = 0)
labelIp = tkinter.Label(win,text = "ip",font=("黑体",10)).grid(row=1,column = 0)
labelPort = tkinter.Label(win,text = "port",font=("黑体",10)).grid(row=2,column = 0)
euser = tkinter.Variable()
eip = tkinter.Variable()
eport = tkinter.Variable()
entryUser = tkinter.Entry(win,textvariable=euser).grid(row=0,column = 1)
entryIp = tkinter.Entry(win,textvariable=eip).grid(row=1,column = 1)
entryPort = tkinter.Entry(win,textvariable=eport).grid(row=2,column = 1)
button = tkinter.Button(win,text="连接",command=connectSrever).grid(row=3,column = 0)
text = tkinter.Text(win,width=30,height = 10)
text.grid(row=4,column = 0)
eSend = tkinter.Variable()
entrySend = tkinter.Entry(win,textvariable=eSend).grid(row=5,column = 0)
efriend = tkinter.Variable()
entryFriend = tkinter.Entry(win,textvariable=efriend).grid(row=6,column = 0)
button2 = tkinter.Button(win,text="发送",command=sendMail).grid(row=6,column = 1)
win.mainloop()
运行结果:
服务器启动
三个客户端启动
一起学习,一起进步 -.- ,如有错误,可以发评论