学习Python的日子 Python高级(8)

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.关闭

猜你喜欢

转载自blog.csdn.net/qq_42240071/article/details/80447740
今日推荐