tcp實現網絡通訊

本章節使用socket套接字利用tcp在python環境下實現小文件傳輸功能,後續將擴展tcp連接過程當中的3次握手4次揮手。python

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)socket

  # 目的地址ip、port(注意ip地址數據類型爲字符串)
  address = ('',8880)tcp

  # tcp套接字連接目的地址
  socket_tcp.connect(address)函數

  file_name = input('請輸入目標文件名')線程

  # 向服務器發送請求文件名
  socket_tcp.send(file_name.encode('utf-8'))調試

  # 此處阻塞,等待接受服務器返回的數據
  message = socket_tcp.recv(1024)code

  # 如有返回數據,建立文件夾並寫入
  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()

相關文章
相關標籤/搜索