1. 程式人生 > >tcp 互相傳送訊息 與 下載檔案

tcp 互相傳送訊息 與 下載檔案

互相傳送訊息(我使用的是自己給自己發訊息 改變主機名 與埠號 可實現不同主機之間通訊)

客戶端:

# -*- coding: utf-8 -*-   
from socket import *  
  
HOST = 'localhost'          #主機名  
PORT =  9999               #埠號 與伺服器一致  
BUFSIZE = 1024              #緩衝區大小1K  
ADDR = (HOST,PORT)  
  
tcpCliSock = socket(AF_INET, SOCK_STREAM)  
tcpCliSock.connect(ADDR)    #連線伺服器  
  
while True:                 #無限迴圈等待連線到來  
    try:  
        data = raw_input('Client')  
        if not data:  
            break  
        tcpCliSock.send(data)            #傳送資料
        
        data = tcpCliSock.recv(BUFSIZE)  #接受資料  
        if not data:  
            break  
        print 'Server: ', data  
    except Exception,e:  
        print 'Error: ',e  
          
tcpCliSock.close()          #關閉客戶端  


 

伺服器端:

# -*- coding: utf-8 -*-   
from socket import *  
from time import ctime  
  
HOST = 'localhost'          #主機名  
PORT =  9999               #埠號  
BUFSIZE = 1024              #緩衝區大小1K  
ADDR = (HOST,PORT)  
  
tcpSerSock = socket(AF_INET, SOCK_STREAM)  
tcpSerSock.bind(ADDR)       #繫結地址到套接字  
tcpSerSock.listen(5)        #監聽 最多同時5個連線進來  
  
while True:                 #無限迴圈等待連線到來  
    try:  
        print 'Waiting for connection ....'  
        tcpCliSock, addr = tcpSerSock.accept()  #被動接受客戶端連線  
        #print u'Connected client from : ', addr  
  
        while True:  
            data = tcpCliSock.recv(BUFSIZE)     #接受資料  
            if not data:  
                break  
            else:  
                print 'Client: ',data
            ss=raw_input('Server')
            tcpCliSock.send(ss)  
  
    except Exception,e:  
        print 'Error: ',e  
tcpSerSock.close()          #關閉伺服器  


tcp下載檔案(我使用的是本機 與 阿里雲伺服器):

 

客戶端:

# -*- coding: cp936 -*-
import socket
 
if __name__ == '__main__':
    # 建立套接字,AF_INET:ipv4,SOCK_STREAM:TCP協議
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 和服務端連線
    tcp_client_socket.connect(("伺服器ip地址", 5555))
    # 傳送下載檔案的請求
    file_name = 'cs.txt'
    # 個人在服務端和客戶端都採用utf-8編碼
    file_name_data = file_name.encode("utf-8")
    # 傳送請求資料
    tcp_client_socket.send(file_name_data)
    # 把資料寫入到檔案裡
    with open("C:/Users/Administrator/Desktop/" + file_name, "a+") as file:
        while True:
            # 迴圈接收檔案資料
            file_data = tcp_client_socket.recv(1024)
            # 只要接收到資料,就寫入
            if file_data:
                file.write(file_data)
            else:
                print("服務端把資料傳送完成並關閉了連線")
                break
    # 關閉套接字
    tcp_client_socket.close()


伺服器:

# -*- coding: utf-8 -*-
import socket
import os
 
 
if __name__ == '__main__':
 
    # 在這裡我將os.path的預設路徑進行了更改,改到了桌面
    os.chdir("C:/study/class/")
    # 建立tcp服務端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 繫結埠號,ip地址不繫結
    tcp_server_socket.bind(("", 5555))
    # 程式結束,釋放埠號,埠號複用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 設定監聽,把主動套接字變成被動套接字,服務端套接字只負責接收客戶端的連線請求
    tcp_server_socket.listen(128)
    while True:
        service_client_socket, ip_port = tcp_server_socket.accept()
        print("客戶端連線成功了:", ip_port)
        # 接收客戶端的請求資訊
        file_name_data = service_client_socket.recv(1024)
        # 對二進位制資料進行解碼
        file_name = file_name_data.decode("utf-8")
        print(file_name)
        # 判斷檔案是否存在
        if os.path.exists(file_name):
            # 檔案存在
            with open(file_name, "rb") as file:
                # 讀取檔案資料
                while True:
                    # 迴圈讀取檔案資料
                    file_data = file.read(1024)
                    #表示讀到資料
                    if file_data:
                        # 然後把資料傳送給客戶端
                        service_client_socket.send(file_data)
                    else:
                        print("請求的檔案資料傳送完成")
                        break
        else:
            print("您請求下載的檔案不存在")
        # 終止和這個客戶端服務
        service_client_socket.close()
        # 終止客戶端連線請求服務, 服務端的套接字可以不用關閉
        tcp_server_socket.close()

 

伺服器端需要在指定目錄下 寫該檔案,客戶端不用先新建(使用的a+)

先執行伺服器,再執行客戶端

傳輸成功的顯示