基于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-
  • 7
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现客户端服务端的通信可以使用套接字(socket)来实现,具体步骤如下: 1. 创建套接字 客户端服务端都需要创建一个套接字。在C语言中,我们可以使用`socket()`函数来创建套接字,函数原型如下: ```c int socket(int domain, int type, int protocol); ``` 其中,`domain`表示协议族,比如`AF_INET`表示IPv4协议族,`type`表示套接字类型,比如`SOCK_STREAM`表示面向连接的套接字,`protocol`表示具体的协议,比如`IPPROTO_TCP`表示TCP协议。如果不确定应该传什么参数,可以参考具体的应用场景。 2. 绑定地址 服务端需要将自己的地址与套接字绑定,这样客户端才能连接到服务端。在C语言中,我们可以使用`bind()`函数来绑定地址,函数原型如下: ```c int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` 其中,`sockfd`表示套接字描述符,`addr`表示要绑定的地址,`addrlen`表示地址的长度。 3. 监听连接 服务端需要监听客户端的连接请求,这样客户端才能连接到服务端。在C语言中,我们可以使用`listen()`函数来监听连接,函数原型如下: ```c int listen(int sockfd, int backlog); ``` 其中,`sockfd`表示套接字描述符,`backlog`表示连接队列的长度,如果连接请求超过了队列长度,将会被拒绝。 4. 接受连接 客户端连接到服务端后,服务端需要接受连接,这样客户端服务端才能开始进行通信。在C语言中,我们可以使用`accept()`函数来接受连接,函数原型如下: ```c int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` 其中,`sockfd`表示套接字描述符,`addr`表示客户端的地址,`addrlen`表示地址的长度。 5. 发送和接收数据 客户端服务端连接成功后,就可以进行数据的发送和接收了。在C语言中,我们可以使用`send()`函数来发送数据,函数原型如下: ```c ssize_t send(int sockfd, const void *buf, size_t len, int flags); ``` 其中,`sockfd`表示套接字描述符,`buf`表示要发送的数据,`len`表示数据的长度,`flags`表示发送的标志。 同样的,我们可以使用`recv()`函数来接收数据,函数原型如下: ```c ssize_t recv(int sockfd, void *buf, size_t len, int flags); ``` 其中,`sockfd`表示套接字描述符,`buf`表示接收数据的缓冲区,`len`表示缓冲区的长度,`flags`表示接收的标志。 以上就是用C语言实现客户端服务端的通信的基本步骤。具体实现可以参考相关的网络编程教程和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值