开发者学堂课程【Python入门 2020年版:多线程版聊天】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10466
多线程版聊天
内容介绍
一.接收与发送代码
二.转换接收显示
三.操作
四.最终代码
一.接收与发送代码
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('早上好'.encode('utf8'),('192.168.31.199',9090))
//发送消息
data = s.recvfrom(1024)//接收消息
print(data)
s.close()
可以发送和接收消息
运行结果为:
二.转换接收显示
1.代码
import socket
S=socket.socket(socket.AF INET, socket.SOCK DGRAM)
s.sendto('早上好'.encode('utf8'),('192.168.31.199',9090))
#data 的数据类型是一个元组
#元组里第0个元素是接收到的数据
#元组里第1个元素是发送方的 ip 地址和端口号
data,addr=s.recvfrom(1024)
print('接收到了{}地址{}端口的消息:
{}'.format(addr[0],addr[1],data.decode('utf8‘))
s.close()
2.改变后的页面
但是此代码只能聊天聊一次,一直聊天要添加死循环,且只能用此窗口给别人发消息,其他人不能给此客户端发送
三.操作
1.先绑定地址和端口号添加 s.bind(('192.168.31.199',8080))
用我们所写的 py 文件代码(端口号8080)和网络调试助手(端口号9090)发送和接收消息
2、加入 while true 死循环
此时运行只能单方面聊天
3.添加输入 exit 终止聊天功能
if msg == 'exit':
break
此时运行时输入 exit 聊天会被终止,但这时代码并没有停止运行,而是等待网络调试助手发消息,网络调试助手发完消息后此代码停止运行。
这时此代码只能接收一次,所以要再添加 while true 死循环可以继续接收消息。
4.加入循环使窗口可以一直接收消息
def send_msg()://用于发送消息
def recv_msg()://用于接收消息
加入两个线程
发送 t1=threading.Thread(target=send_msg)
接收 t2=threading.Thread(target=recv_msg)
t1.start()
t2.start()
这时运行代码发送和接收的消息在同一位置,容易混乱
5.将接收消息打印到添加的文件里
添加文件 file=open('消息记录.txt','a',encoding='utf8'))
将消息打印到文件中 print('接收到了{}地址{}端口的消息:
{}'.format(addr[0],addr[1],data.decode('utf8’)))
四.最终代码
import socket, sys
import threading
s=socket.socket(socket.AFINET,socket.SOCK_DGRAM) s.bind(('192.168.31.199',8080))
def send_msg():
//用于发送消息
while True:
msg=input('请输入您要发送的内容:)
s.sendto(msg.encode('utf8'),('192.168.31.199',9090))
if msg == 'exit':
break
def recv_msg()://用于接收消息
while True:
#data 的数据类型是一个元组
#元组里第0个元素是接收到的数据
#元组里第1个元素是发送方的 ip 地址和端口号
data,addr=s.recvfrom(1024)
print('接收到了{}地址{}端口的消息:
{}'.format(addr[0],addr[1],data.decode('utf8’)))
file=open('消息记录.txt','a',encoding='utf8'))
t1=threading.Thread(target=send_msg) t2=threading.Thread(target=recv_msg)
t1.start()
t2.start()
用网络调试助手接收消息



