UDP绑定信息:一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定,绑定的意义是使其不变 。
一个电脑可以有多个IP地址
单工:收音机 半双工:对讲机 全双工:电话
UDP和TPC(网络)都是全双工,同一时间能发能收
一般,接收方都需要绑定,发送方不需要绑定
#绑定端口号和ip地址
s.bind(('192.168.43.30',9090))
udp:没有严格的客户端和服务端的区别
tcp:有客户端和服务端,面向连接的协议
import socket
#SOCK_STREAM是基于tcp的socket连接
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#udp直接使用sendto发送数据
#tcp在发送数据之前必须要先和服务器建立连接
#调用connect方法连接服务器
s.connect(('192.168.43.30',9000))
s.send('hello'.encode('utf8'))
s.close()
import socket
# SOCK_STREAM是基于tcp的socket连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定
s.bind(('192.168.43.30', 9000))
# 1000 1120 ==> 120个排队
# 1000 1130 ==> 128个排队 另外2个就连接不上了
s.listen(128) # 128表示队列的长度,把socket变成了一个被动监听的socket
# x=s.accept() #接受客户端的请求
# 接受到的结果是一个元组,有两个元素
# 第0个元素是客户端的socket连接,第1个元素是客户端的ip地址和端口号
# print(x)
# (, ('192.168.43.30', 53981))
client_socket, client_addr = s.accept()
# tcp里使用recv获取数据
data = client_socket.recv(1024)
print('接收到了{}客户端{}端口号发送的数据,内容是:{}'.format(client_addr[0], client_addr[1], data.decode('utf8')))
s.close()
文件下载客户端:
import socket
#tcp连接
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.50.20',9000))
file_name=input('请输入要传输的文件:')
s.send(file_name.encode('utf-8'))
with open('xs1.jpg','wb') as file:
while True:
data = s.recv(1024)
if not data:
break
file.write(data)
s.close()
文件下载服务端:
import socket
import os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('192.168.50.20',9000))
s.listen(128)
socket_client,addr=s.accept()
data=socket_client.recv(1024)
print('从{}客户端的{}端口接收到内容为{}'.format(addr[0],addr[1],data.decode('utf-8')))
file_name=data.decode('utf-8')
if os.path.isfile(file_name):
with open(file_name,'rb') as file:
content=file.read()
socket_client.send(content)
s.close()
多个任务同时执行
python里执行多任务:多线程、多进程、多线程+多进程
import threading
import time
def dance():
for i in range(50):
time.sleep(0.3)
print('我正在跳舞')
def sing():
for i in range(50):
time.sleep(0.3)
print('我正在唱歌')
# target 需要的是一个函数,用来指定线程需要执行的任务
t1 = threading.Thread(target=dance) # 创建了线程1
t2 = threading.Thread(target=sing) # 创建了线程2
# 启动线程
t1.start()
t2.start()