本章节使用socket套接字利用tcp在python环境下实现小文件传输功能,后续将扩展tcp链接过程中的3次握手4次挥手。
tcp网络通信中区分客户端、服务器,服务器需绑定ip、port,客户端无需绑定ip、port。
客户端:
import socket
def main():
# 创建tcp套接字,socket.AF_INET ->对应ipv4命名规则;socket.SOCK_STREAM —>对应调用tcp套接字 socket_tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 目的地址ip、port(注意ip地址数据类型为字符串)
address = ('',8880)# tcp套接字链接目的地址
socket_tcp.connect(address)file_name = input('请输入目标文件名')
# 向服务器发送请求文件名
socket_tcp.send(file_name.encode('utf-8'))# 此处阻塞,等待接受服务器返回的数据
message = socket_tcp.recv(1024)# 若有返回数据,创建文件夹并写入
if message: with open('new_'+file_name,'wb') as files: files.write(message)#关闭tcp套接字
socket_tcp.close()if __name__ == '__main__':
main()
服务器:
import socket
import threading
def recv_send(new_socket):
# 此处阻塞,等待客户端发来消息
message = new_socket.recv(1024)print(message)
files = None
try : files = open(message,'rb') except Exception as res: print('无此文件!') if files: new_socket.send(files.read())# 关闭tcp套接字
# 关闭的同时默认向对方发送空字符,代表关闭套接字 new_socket.close()def main():
# 创建tcp 套接字 socket_tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# tcp先发起挥手的一方要等待对方最后发来的数据2到3分钟左右占用端口,这里为方便调试去掉等待。
socket_tcp.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# 绑定本地ip、port地址
local_address = ('',8880) socket_tcp.bind(local_address)# 将tcp套接字调为被动接听状态
socket_tcp.listen(128)while True:
# 此处阻塞,服务器等待接听客户端接入 new_socket,source_address = socket_tcp.accept()#创建多线程对象,target赋值为多线程函数,args赋值为传入函数的参数,形式为元组。
t1 = threading.Thread(target = recv_send,args = (new_socket,))
t1.start()
socket_tcp.close()if __name__ == '__main__': main()