python学习笔记(二十九)网络通信之模仿qq的在线聊天工具

 

基于之前学习过的进程与线程的知识以及网络通信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()

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值