ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-16 13:02:21  阅读:104  来源: 互联网

标签:socket TCP client 服务端 print 服务器 文件传送 客户端


项目简介:本项目所使用的编程语言为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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有