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+)
先執行伺服器,再執行客戶端