基于之前学习过的进程与线程的知识以及网络通信tcp与udp的原理,可以编写一个模仿qq的小程序
一、操作界面:(比较简陋,可以根据自己的要求来更改样式)
1、服务器界面:
2、客户端界面
3、首先启动服务器:(端口号自己设定)
4、启动客户端连接至服务器
输入信息,点击并登录
此时,在服务器的控制台上就能看到已连接至服务器的主机:
5、再启动两台主机按照相同方法连接至服务器:
7、在输入框输入数据以及发送方即可实现通信
二、代码实现:
1、服务器:
#192.168.1.103
import tkinter
import socket
import threading
win = tkinter.Tk()
win.title("聊天服务器")
win.geometry("400x100+200+50")
users = {}
def run(ck,ca):
print("*********************")
UserName = ck.recv(1024)
users[UserName.decode("utf-8")] = ck
print(users)
while True:
rData = ck.recv(1024)
dataStr = rData.decode("utf-8")
#dx:hello
infolist = dataStr.split(":")
users[infolist[0]].send((UserName.decode("utf-8")+"说:"+infolist[1]).encode("utf-8"))
def start():
ipStr = eip.get()
portStr = eport.get()
# 创建一个socket
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:
# 等待链接
ck, ca = server.accept()
# print("%s--%s链接成功"%(str(clientSocket),clientAddress))
t = threading.Thread(target=run, args=(ck, ca))
t.start()
def startServer():
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=startServer).grid(row=4,column=1)
text = tkinter.Text(win,width=30,height=1)
text.grid(row=5,column=0)
win.mainloop()
2、客户端:
import tkinter
import socket
import threading
win = tkinter.Tk()
win.title("窗体")
win.geometry("400x400+200+50")
ck = None
def getInfo():
while True:
data = ck.recv(1024)
text.insert(tkinter.INSERT,data.decode("utf-8"))
#登录
def login():
global ck
#获取ip
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)
text.insert(tkinter.INSERT,userStr+"进入聊天室")
t.start()
#发送信息
def sendMessage():
friend = efriend.get()
sendStr = esend.get()
sendStr = friend + ":" +sendStr
ck.send(sendStr.encode("utf-8"))
labelUser = 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=login).grid(row=3,column=1)
text = tkinter.Text(win,width=30,height=5)
text.grid(row=4,column=0)
labelsend= tkinter.Label(win,text="请输入发送内容" ).grid(row=6,column=0)
esend = tkinter.Variable()
entrySend = tkinter.Entry(win,textvariable=esend).grid(row=6,column=1)
labelfriend = tkinter.Label(win,text="请输入发送地址" ).grid(row=7,column=0)
efriend= tkinter.Variable()
entryFriend = tkinter.Entry(win,textvariable=efriend).grid(row=7,column=1)
button2 = tkinter.Button(win,text="发送",command=sendMessage).grid(row=8,column=1)
win.mainloop()