其他分享
首页 > 其他分享> > 基于TCP实现客户端与服务端之间的网络通信和文件传送

基于TCP实现客户端与服务端之间的网络通信和文件传送

作者:互联网

项目简介:本项目所使用的编程语言为python,通过socket和TCP实现客户端与服务器之间一对一的网络通信、可以对客户端与服务器之间的聊天记录进行查询,实现客户端发送文件到服务器的功能。

文章目录

(一)环境配置

(二)客户端

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