Python高级
聊天发送和接收
发送
from socket import *
# 发送方
send_socket=socket(AF_INET,SOCK_DGRAM)
while True:
# 发
msg=input(">>:")
send_socket.sendto(msg.encode("utf-8"),("192.168.28.34",9992))
if msg=="bye":
break
# 收
content=send_socket.recvfrom(1024)
print("收到:",content[0].decode("utf-8"))
send_socket.close()
接收
from socket import *
# 发送方
from threading import Thread
recv_socket = socket(AF_INET, SOCK_DGRAM)
recv_socket.bind(("", 9992))
while True:
content = recv_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
# print("=====>",content[1])
print("收到:", msg)
if msg == "byebye":
break
msg = input(">>:")
recv_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", content[1]))
recv_socket.close()
多线程聊天
发送
from socket import *
from threading import Thread
# 发送方
send_socket = socket(AF_INET, SOCK_DGRAM)
send_socket.bind(("",9999))
# while True:
# # 发
# msg=input(">>:")
# send_socket.sendto(msg.encode("utf-8"),("192.168.28.34",9992))
# if msg=="bye":
# break
# # 收
# content=send_socket.recvfrom(1024)
# print("收到:",content[0].decode("utf-8"))
def recv_msg():
while True:
content = send_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print("收到:", msg)
if msg == "byebye":
break
def send_msg():
while True:
msg = input(">>:")
send_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", 9992))
if msg == "byebye":
break
#
t1 = Thread(target=recv_msg)
t2 = Thread(target=send_msg)
t1.start()
t2.start()
# 让步
t1.join()
t2.join()
send_socket.close()
接收
from socket import *
# 发送方
from threading import Thread
recv_socket = socket(AF_INET, SOCK_DGRAM)
recv_socket.bind(("", 9992))
def recv_msg():
while True:
content = recv_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print("=====>",content[1])
print("收到:", msg)
if msg == "byebye":
break
def send_msg():
while True:
msg = input(">>:")
recv_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", 9999))
if msg == "byebye":
break
#
t1 = Thread(target=recv_msg)
t2 = Thread(target=send_msg)
t1.start()
t2.start()
# 让步
t1.join()
t2.join()
recv_socket.close()
文件上传
步骤
1.读取本地文件 open---》read()
2.创建socket对象
3.sendto
4.关闭 文件,socket
上传
import os
from socket import *
# 1.创建socket对象
upload_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 打开文件读取内容
fr = open("./test.py", "r")
content = fr.read()
print("文件的长度:",len(content))
#3.送出内容 127.0.0.1 localhost 本机
upload_socket.sendto(content.encode("utf-8"),("127.0.0.1",9998))
# 4.关闭
fr.close()
upload_socket.close()
服务器接收
from socket import *
# 1.创建socket对象
upload_socket = socket(AF_INET, SOCK_DGRAM)
upload_socket.bind(("", 9998))
# 2.创建流对象
fw = open("./upload/aa.py", "w")
# 3. 收内容并且往本地写
while True:
content = upload_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print(msg)
fw.write(msg)
if len(msg) < 1024:
break
# 4. 关闭
fw.close()
upload_socket.close()
pack和unpack
案例
import struct
a = 30
b = 500
name = "tom12"
# 打包
s=struct.pack("!ii3s",a,b,name.encode("utf-8"))
print("打包后的长度:",len(s))
print(s)
#拆包
s1=struct.unpack("!ii3s",s) # 返回值是一个元组
print(s1)
装包
import struct
from socket import *
udp_socket=socket(AF_INET,SOCK_DGRAM)
send_message=struct.pack("!H6sH3s",1,"aa.jpg".encode("utf-8"),0,b'ABC')
udp_socket.sendto(send_message,("127.0.0.1",9995))
udp_socket.close()
拆包
import struct
from socket import *
udp_socket = socket(AF_INET, SOCK_DGRAM)
udp_socket.bind(("", 9995))
content = udp_socket.recvfrom(1024)
msg = struct.unpack("!H6sH3s", content[0])
print(msg)
udp_socket.close()
broadcast
案例
from socket import *
import time
sock = socket(AF_INET, SOCK_DGRAM) # udp
sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) # 声明广播类型的socket
for i in range(2,254):
# 1:12312312312:美女:妹妹-pc:32:约吗
sock.sendto("1:12312312312:美女:妹妹-pc:32:约吗".encode("gb2312"), ("192.168.28."+str(i), 2425))
sock.close()
回顾
线程
不安全性:多个线程共享数据,操作共享数据的语句由多句组成
互斥锁:降低效率
GIL
死锁: 避免的
生产者与消费者: Queue
网络通信
客户端 服务端
发送 接收
协议
TCP/IP协议
IP+端口号
IP:定位设备(电脑)
端口号:固定 注册 动态
udp与tcp
import socket
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) --->TCP ---》流
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ---->udp ---》数据包
datagrame---》
网络中传输:str,int ----》二进制
"".encode("utf-8") <-----> "".decode("utf-8")
"".encode("gb2312") <-----> "".decode("gb2312")
发送方:
upd_socket ---->sendto("",(ip,port))
接收方:
udp_socket --->recvfrom(1024) ---->收到:content 元组 (ip,发件人端口)
TCP
客户端
from socket import *
socket_client = socket(AF_INET, SOCK_STREAM) # SOCK_STREAM TCP协议
socket_client.connect(("127.0.0.1",8888)) #
socket_client.send("哈哈哈".encode("utf-8"))
socket_client.close()
服务器
from socket import *
socket_server = socket(AF_INET, SOCK_STREAM) # SOCK_STREAM TCP协议
socket_server.bind(("", 8888))
socket_server.listen(5)
while True:
# 接收请求
new_socket,src_addr= socket_server.accept()
print(new_socket)
content = new_socket.recv(1024)
print(content.decode("utf-8"))
new_socket.close()
arp -d 需要管理员权限才可以,所以大家的也不能使用
删除
arp -a
查看
步骤
1.创建socket对象
2.绑定端口
3.监听动作
4.accept() --->返回值socket
5.收发数据
6.关闭
聊天发送和接收
发送
from socket import *
# 发送方
send_socket=socket(AF_INET,SOCK_DGRAM)
while True:
# 发
msg=input(">>:")
send_socket.sendto(msg.encode("utf-8"),("192.168.28.34",9992))
if msg=="bye":
break
# 收
content=send_socket.recvfrom(1024)
print("收到:",content[0].decode("utf-8"))
send_socket.close()
接收
from socket import *
# 发送方
from threading import Thread
recv_socket = socket(AF_INET, SOCK_DGRAM)
recv_socket.bind(("", 9992))
while True:
content = recv_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
# print("=====>",content[1])
print("收到:", msg)
if msg == "byebye":
break
msg = input(">>:")
recv_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", content[1]))
recv_socket.close()
多线程聊天
发送
from socket import *
from threading import Thread
# 发送方
send_socket = socket(AF_INET, SOCK_DGRAM)
send_socket.bind(("",9999))
# while True:
# # 发
# msg=input(">>:")
# send_socket.sendto(msg.encode("utf-8"),("192.168.28.34",9992))
# if msg=="bye":
# break
# # 收
# content=send_socket.recvfrom(1024)
# print("收到:",content[0].decode("utf-8"))
def recv_msg():
while True:
content = send_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print("收到:", msg)
if msg == "byebye":
break
def send_msg():
while True:
msg = input(">>:")
send_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", 9992))
if msg == "byebye":
break
#
t1 = Thread(target=recv_msg)
t2 = Thread(target=send_msg)
t1.start()
t2.start()
# 让步
t1.join()
t2.join()
send_socket.close()
接收
from socket import *
# 发送方
from threading import Thread
recv_socket = socket(AF_INET, SOCK_DGRAM)
recv_socket.bind(("", 9992))
def recv_msg():
while True:
content = recv_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print("=====>",content[1])
print("收到:", msg)
if msg == "byebye":
break
def send_msg():
while True:
msg = input(">>:")
recv_socket.sendto(msg.encode("utf-8"), ("192.168.28.34", 9999))
if msg == "byebye":
break
#
t1 = Thread(target=recv_msg)
t2 = Thread(target=send_msg)
t1.start()
t2.start()
# 让步
t1.join()
t2.join()
recv_socket.close()
文件上传
步骤
1.读取本地文件 open---》read()
2.创建socket对象
3.sendto
4.关闭 文件,socket
上传
import os
from socket import *
# 1.创建socket对象
upload_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 打开文件读取内容
fr = open("./test.py", "r")
content = fr.read()
print("文件的长度:",len(content))
#3.送出内容 127.0.0.1 localhost 本机
upload_socket.sendto(content.encode("utf-8"),("127.0.0.1",9998))
# 4.关闭
fr.close()
upload_socket.close()
服务器接收
from socket import *
# 1.创建socket对象
upload_socket = socket(AF_INET, SOCK_DGRAM)
upload_socket.bind(("", 9998))
# 2.创建流对象
fw = open("./upload/aa.py", "w")
# 3. 收内容并且往本地写
while True:
content = upload_socket.recvfrom(1024)
msg = content[0].decode("utf-8")
print(msg)
fw.write(msg)
if len(msg) < 1024:
break
# 4. 关闭
fw.close()
upload_socket.close()
pack和unpack
案例
import struct
a = 30
b = 500
name = "tom12"
# 打包
s=struct.pack("!ii3s",a,b,name.encode("utf-8"))
print("打包后的长度:",len(s))
print(s)
#拆包
s1=struct.unpack("!ii3s",s) # 返回值是一个元组
print(s1)
装包
import struct
from socket import *
udp_socket=socket(AF_INET,SOCK_DGRAM)
send_message=struct.pack("!H6sH3s",1,"aa.jpg".encode("utf-8"),0,b'ABC')
udp_socket.sendto(send_message,("127.0.0.1",9995))
udp_socket.close()
拆包
import struct
from socket import *
udp_socket = socket(AF_INET, SOCK_DGRAM)
udp_socket.bind(("", 9995))
content = udp_socket.recvfrom(1024)
msg = struct.unpack("!H6sH3s", content[0])
print(msg)
udp_socket.close()
broadcast
案例
from socket import *
import time
sock = socket(AF_INET, SOCK_DGRAM) # udp
sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) # 声明广播类型的socket
for i in range(2,254):
# 1:12312312312:美女:妹妹-pc:32:约吗
sock.sendto("1:12312312312:美女:妹妹-pc:32:约吗".encode("gb2312"), ("192.168.28."+str(i), 2425))
sock.close()
回顾
线程
不安全性:多个线程共享数据,操作共享数据的语句由多句组成
互斥锁:降低效率
GIL
死锁: 避免的
生产者与消费者: Queue
网络通信
客户端 服务端
发送 接收
协议
TCP/IP协议
IP+端口号
IP:定位设备(电脑)
端口号:固定 注册 动态
udp与tcp
import socket
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) --->TCP ---》流
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ---->udp ---》数据包
datagrame---》
网络中传输:str,int ----》二进制
"".encode("utf-8") <-----> "".decode("utf-8")
"".encode("gb2312") <-----> "".decode("gb2312")
发送方:
upd_socket ---->sendto("",(ip,port))
接收方:
udp_socket --->recvfrom(1024) ---->收到:content 元组 (ip,发件人端口)
TCP
客户端
from socket import *
socket_client = socket(AF_INET, SOCK_STREAM) # SOCK_STREAM TCP协议
socket_client.connect(("127.0.0.1",8888)) #
socket_client.send("哈哈哈".encode("utf-8"))
socket_client.close()
服务器
from socket import *
socket_server = socket(AF_INET, SOCK_STREAM) # SOCK_STREAM TCP协议
socket_server.bind(("", 8888))
socket_server.listen(5)
while True:
# 接收请求
new_socket,src_addr= socket_server.accept()
print(new_socket)
content = new_socket.recv(1024)
print(content.decode("utf-8"))
new_socket.close()
arp -d 需要管理员权限才可以,所以大家的也不能使用
删除
arp -a
查看
步骤
1.创建socket对象
2.绑定端口
3.监听动作
4.accept() --->返回值socket
5.收发数据
6.关闭