基於socket簡單的TCP下載和傳輸
阿新 • • 發佈:2018-12-01
客戶端:
import socket def main(): tcp_custom=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sev_ip=input('shu ru ip:') sev_port=input('shu ru port:') tcp_custom.connect((sev_ip,int(sev_port))) file_name=input('shu ru ming:') tcp_custom.send(file_name.encode('utf-8')) rec_data=tcp_custom.recv(1024) if rec_data: with open('jieshou'+file_name,'wb') as f: f.write(rec_data) else: print('bucunzai') if __name__=='__main__': main()
伺服器端:
import socket def open_file(requirt_data,new_socket): content=None try: f=open(requirt_data,'rb') content=f.read() f.close() except Exception as ex: print("不存在檔案",requirt_data) if content: new_socket.send(content) print('下載成功') def main(): #建立套接字 tcp_service=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #繫結ip埠 tcp_service.bind(('127.0.0.1',6666)) #建立監聽 tcp_service.listen() #接受相應 while True: print('等到客戶端.......') new_socket,client_inf=tcp_service.accept() #接受資訊 print('建立一對一連結') requirt_data=new_socket.recv(1024).decode('utf-8') print("來自客戶端(%s)請求下載%s"%(client_inf,requirt_data)) open_file(requirt_data,new_socket) new_socket.close() if __name__ == '__main__': main()
tcp注意點:
1.tcp伺服器一般情況下都需要繫結,否則客戶找不到這個伺服器連結
2,tcp客戶端一般不需要繫結,因為是主動連結伺服器,因為主動連結伺服器,所以只要確定好伺服器ip,port等資訊就好,本地客戶端可以是隨機
3,tcp伺服器中listen可將socket創建出來的主動套接字變為被動的,這是tcp伺服器必須做的
4,當客戶端需要連結伺服器是,就需要connect連結,udp不需要連結,tcp必須連結
5,當一個tcp客戶連結伺服器是,伺服器會有一個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶服務。
6,listen後的套接字為被動套接字,用來接收新的客戶端連結請求,而accept返回的新的套接字是標記這個新客戶端的
7,關閉listen後的套接字意味著被動套接字關閉了,會導致新的客戶端不能連結伺服器,但是之前已經連結成功的客戶端正常通訊
8,關閉accept返回的套接字意味著這個客戶端已經服務完畢
9當客戶端的套接字呼叫close後,服務端會recv解堵塞,並且返回的長度為0,因此伺服器可以通過返回資料的長度來區分客戶端是否下線