socket的工作流程:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
tcp和udp的区别:
tcp是面向连接的,可靠的(网络传输中丢失的数据包会被检测到并重新发送),有序的(数据按发送者写入的顺序被读取)。
udp是面向无连接的,不可靠,无序的。
import socket
def main():
#1.创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.获取服务器的ip/port
server_ip = input("请输入服务器端的ip:")
server_port =int(input("请输入服务器的端口号:"))
server_address = (server_ip,server_port)
#3.连接到服务器
tcp_socket.connect(server_address)
#4.获取下载文件的名称
down_file = input("请输入想要下载的文件名:")
#5.将文件名发送给服务器
tcp_socket.send(down_file.encode("utf-8"))
#6.接收文件中的数据
recv_data = tcp_socket.recv(1024) #1024:文件大小
#7.保存接收到的数据到文件中
if recv_data: #recv_data中没有数据时,if 0:不执行if下的代码块
with open("[附件]"+down_file,"wb") as f:
f.write(recv_data)
#8.关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
import socket
def bind_listen(tcp_socket):
# 绑定信息(bind)
tcp_socket.bind(("", 7896))
# 监听(listen)
tcp_socket.listen(128) # 128:同时在线人数
def send_file(new_client,other_client):
"""给客户端发送文件及判断"""
#接收客户端下载文件的请求
file_name = new_client.recv(1024).decode("utf-8")
print("客户端[%s]需要下载的文件是:%s"%(str(other_client),file_name))
#打开文件并且读取数据
#假设文件为空
file_content = None
try:
f = open(file_name,"rb") #rb:以只读方式打开二进制文件
file_content = f.read()
f.close()
except Exception as ret:
print("没有要打开的文件:%s"%file_name)
if file_content:
#发送文件的数据给客户端呢
new_client.send(file_content)
def main():
#创建套接字(socket)
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bind_listen(tcp_socket)
while True:
#等待
new_client,other_client = tcp_socket.accept()
#调用发送文件的函数,给客户端服务
send_file(new_client,other_client)
#关闭客户端套接字
new_client.close()
#关闭服务器套接字
other_client.close()
if __name__ == "__main__":
main()