基于TCP实现客户端与服务端之间的网络通信和文件传送
作者:互联网
项目简介:本项目所使用的编程语言为python,通过socket和TCP实现客户端与服务器之间一对一的网络通信、可以对客户端与服务器之间的聊天记录进行查询,实现客户端发送文件到服务器的功能。
文章目录
(一)环境配置
- windows 10(必须提前配置好Python环境)
- ubuntu 18.04(必须提前配置好Python环境)
- python环境 3.7.3
- 编程语言:Python
(二)客户端
1.简介:
客户端通过socket对象连接到服务器,主要实现两个功能,一是打开与服务器聊天的窗口,二是把文件传送到服务器,在windows 10上运行。
2.运行效果图
3.客户端代码
import socket
import os
import time
# 聊天窗口模块
def chat():
# 创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置服务端的ip地址
host = "127.0.0.1" # 本机的ip地址,必须与下面的服务器地址一致
# 设置端口
port = 12345 # 必须与下面的服务器端口号一致
# 连接服务端
client.connect((host, port))
print("按q键结束连接服务器! 退出程序")
# while循环是为了保证能持续进行对话
while True:
# 输入发送的消息
sendmsg = input("请输入:")
# 如果客户端输入的是q,则停止对话并且退出程序
if sendmsg == 'q':
break
sendmsg = sendmsg
# 发送数据,以二进制的形式发送数据,所以需要进行编码
client.send(sendmsg.encode("utf-8"))
msg = client.recv(1024)
# 接收服务端返回的数据,需要解码
print("收到:", msg.decode("utf-8"))
# 关闭客户端
client.close()
# 文件传输模块
def file():
filename = input('请输入要传输的文件名:\n')
filesize = str(os.path.getsize(filename))
fname1, fname2 = os.path.split(filename)
# 创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置服务端的ip地址
host = "127.0.0.1"
# 设置端口
port = 12345
# 连接服务端
client.connect((host, port))
f = open(filename, 'rb')
count = 0
flag = 1
while True:
if count == 0:
client.send(filesize.encode())
start = time.time()
client.recv(1024)
client.send(fname2.encode())
for line in f:
client.send(line)
print('正在发送......')
# client.send(b'end')
client.send(b' ')
break
client.close
#计算发送所用时间
end = time.time()
print('所用时间:' + str(round(end - start, 2)) + 's')
if __name__=="__main__":
print("请输入相应功能实现:")
print("1:打开聊天窗口")
print("2:传输文件")
print("q:退出程序")
print("="*30)
while True:
res = str(input())
if res == "1":
chat()
elif res == "2":
file()
if res == "q":
break
else:
break
(三)服务器
1.简介:
服务器用于接收客户端的请求,并相应客户端的请求。服务端主要实现3个功能,一实现打开与客户端聊天的窗口,二实现聊天记录的查询,三实现接收客户端发送过来的文件。服务端主要部署在ubuntu上。
2.运行效果图
留心:在ubuntu上运行server.py文件一定要使用python3 server.py,如果使用Python2运行就会报错!!!
3.服务器代码
import socket
import time
# 存储信息模块
def save_txt(strData,msg):
with open("./save.txt", "a") as fp:
try:
if strData:
# 打开save.txt,对服务器收到的信息进行存储
fp.write("客户端信息:"+ strData+"\n")
except:
pass
# 打开save.txt,对服务器发送的信息进行存储
try:
if msg:
fp.write("服务器信息:"+msg+"\n")
except:
pass
# 查看信息模块
def read_txt():
fp = open('save.txt','r')
print("=="*30)
# print("上一次聊天记录如下:"+"\n")
for i in fp:
print(i)
# 接收文件模块
def file_send():
socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketserver.bind(('127.0.0.1',12345))
socketserver.listen(5)
print('等待客户端的连接......')
count = 0
while True:
sock, addr = socketserver.accept()
print('接收一个新的客户端来自:%s:%s...' % addr)
if count == 0:
# 接收数据
data1 = sock.recv(1024)
print(str(data1))
# 文件大小
file_total_size = int(data1.decode())
received_size = 0
sock.send('received'.encode())
data = sock.recv(1024)
filepath = str(data.decode())
f = open(filepath, 'wb')
while received_size < file_total_size:
data = sock.recv(1024)
f.write(data)
received_size += len(data)
print('已接收 ', received_size, ' Byte')
data = sock.recv(1024)
if data == b' ':
break
f.close()
socketserver.close()
# 聊天窗口模块
def user_link():
print("等待客户端的连接......")
# 创建服务端的socket对象socketserver
socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 12345
# 绑定地址(包括ip地址会端口号)
socketserver.bind((host, port))
# 设置监听
socketserver.listen(5)
# 注意:accept()函数会返回一个元组,即(ip地址,端口号)
clientsocket, addr = socketserver.accept()
# 用于区分每次不同的聊天记录
with open("./save.txt", "a") as fp:
fp.write('=='*30+"\n"+"上一次聊天记录"+"\n")
# while循环是为了能让对话一直进行,直到客户端输入q
while True:
# 接收客户端的请求
recvmsg = clientsocket.recv(1024)
# 把接收到的数据进行解码
strData = recvmsg.decode("utf-8")
# 判断客户端是否发送q,是就退出此次对话
if strData == 'q':
break
else:
print("收到:" + strData)
msg = input("回复:")
# 对要发送的数据进行编码
clientsocket.send(msg.encode("utf-8"))
save_txt(strData, msg)
socketserver.close()
if __name__=='__main__':
# 请输入对应功能:1:打开服务器连接 2;查看聊天记录
print("请输入对应功能: ")
print("1:打开聊天窗口")
print("2:查看聊天记录")
print("3:进行文件传输")
res =str(input())
if res == '1':
print("正在打开服务器的连接...")
user_link()
elif res == '2':
read_txt()
elif res == '3':
file_send()
else:
print("输入有误!请重新输入")
res = print(input("请输入对应功能:1:打开聊天窗口 2:查看聊天记录 3:进行文件传输"+"\n"))
留心:服务器与客户端的ip地址和端口号一定要保持一致,如果程序报错,就有可能是两个程序之间的端口或IP地址不一致。
(四)服务器与客户端效果演示
1.聊天窗口演示
2.服务器端查看聊天记录演示
3.客户端传送文件到服务端演示
4.完整代码已上传到githua,如需要请自行前往:https://github.com/nextriy/-TCP-
标签:socket,TCP,client,服务端,print,服务器,文件传送,客户端 来源: https://blog.csdn.net/weixin_48446170/article/details/121245860