1. 程式人生 > >基於socket簡單的TCP下載和傳輸

基於socket簡單的TCP下載和傳輸

客戶端:

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,因此伺服器可以通過返回資料的長度來區分客戶端是否下線