计算机网络实验4之网络协议与实现

一、原理概述

一台计算机的IP地址与此计算机中运行的一个进程的端口号组成套接字,一对套接字则标明了网络通信的双方。通信双方进行通信的规则的集合则称为协议。客户-服务器模式和P2P模式是两种应用最为广泛的网络应用模式。利用运输层协议TCP与UDP进行应用层编程称为套接字编程。

二、实验内容

1、要实现的功能需求分析(可以文件传输为例,或者其他功能)

2、协议设计,包括协议格式、字段说明和通信过程说明。

3、利用套接字编程实现不同计算机间传输文件的简单功能。

自选一种编程工具(写上所选的模式和工具),利用该工具编写服务器端与客户端程序或者p2p模式的程序,至少实现最基本的文件传输功能,最好能实现更完善一些的功能。

三、实验步骤

1.环境准备

操作系统:确保客户端和服务器端运行在相同的操作系统环境下,如Windows、Linux或MacOS。

编程语言:选择合适的编程语言和库来实现客户端和服务器端程序,本实验使用Python语言。

2.编写服务器端程序(server.py)

import socket
import os
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 12345
BUFFER_SIZE = 4096
def receive_file(conn, filename):
    with open(filename, 'wb') as f:
        while True:
            data = conn.recv(BUFFER_SIZE)
            if not data:
                break
            f.write(data)
def handle_client(client_socket):
    print("[*] Accepted connection from: %s:%d" % (client_socket.getpeername()))
    while True:
        try:
            command = client_socket.recv(1024).decode()
            if not command:
                break
            if command.startswith('upload'):
                filename = command.split()[1]
                receive_file(client_socket, filename)
                print(f"[+] Received file: {filename}")
                client_socket.sendall(b"File uploaded successfully.")
            elif command.startswith('download'):
                filename = command.split()[1]
                if os.path.exists(filename):
                    client_socket.sendall(b"READY")
                    with open(filename, 'rb') as f:
                        data = f.read(BUFFER_SIZE)
                        while data:
                            client_socket.send(data)
                            data = f.read(BUFFER_SIZE)
                    print(f"[+] Sent file: {filename}")
                else:
                    client_socket.sendall(b"File not found.")
            elif command.strip() == 'quit':
                break
        except Exception as e:
            print(f"[-] Error: {e}")
            break
    client_socket.close()
def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((SERVER_HOST, SERVER_PORT))
    server_socket.listen(5)
    print(f"[*] Listening on {SERVER_HOST}:{SERVER_PORT}")
    while True:
        client_socket, addr = server_socket.accept()
        handle_client(client_socket)
    server_socket.close()
if __name__ == '__main__':
        main()

3.编写客户端程序(client.py)

import socket
import os
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 12345
BUFFER_SIZE = 4096
def send_file(conn, filename):
    with open(filename, 'rb') as f:
        data = f.read(BUFFER_SIZE)
        while data:
            conn.send(data)
            data = f.read(BUFFER_SIZE)
def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((SERVER_HOST, SERVER_PORT))
    while True:
        try:
            command = input("Enter command (upload <filename>, download <filename>, quit): ")
            client_socket.sendall(command.encode())
            if command.startswith('upload'):
                filename = command.split()[1]
                send_file(client_socket, filename)
                print(f"[+] Uploaded file: {filename}")
                response = client_socket.recv(BUFFER_SIZE)
                print(response.decode())
            elif command.startswith('download'):
                response = client_socket.recv(BUFFER_SIZE)
                if response == b"READY":
                    filename = command.split()[1]
                    with open(filename, 'wb') as f:
                        while True:
                            data = client_socket.recv(BUFFER_SIZE)
                            if not data:
                                break
                            f.write(data)
                    print(f"[+] Downloaded file: {filename}")
                else:
                    print(response.decode())
            elif command.strip() == 'quit':
                break
        except Exception as e:
            print(f"[-] Error: {e}")
            break
    client_socket.close()
if __name__ == '__main__':
    main()

4.客户端操作步骤:

1.启动服务器端:打开命令行或终端,运行“python server.py”启动服务器端程序,监听端口“12345”。

2.启动客户端:打开另一个命令行或终端,运行“python client.py”启动客户端程序。

3.上传文件:在客户端命令行输入“upload test.txt”,其中“test.txt”是要上传的本地文件。

4.检查上传结果:客户端会发送文件给服务器端,服务器端接收文件并保存到当前工作目录下;客户端在接收到服务器端的确认消息后显示“[+] Uploaded file: test.txt”。

5.结束程序:在客户端命令行输入“quit”或直接关闭客户端程序退出。

5.服务器端操作步骤:

1.接收客户端连接:服务器端在启动后等待客户端连接,一旦有客户端连接,会显示连接信息。

2.处理上传请求:服务器端接收到客户端发送的“upload test.txt”命令后,开始接收文件数据。

3.保存上传文件:服务器端将接收到的文件数据保存到当前工作目录下,并发送上传成功的确认消息给客户端。

4.结束程序:服务器端持续监听客户端连接,可通过键盘输入 `Ctrl+C` 结束程序或关闭终端窗口。

6.测试和验证:

1.确保客户端和服务器端在同一网络下,确保上传的文件路径和文件名正确。

2.测试多次上传不同的文件,并检查文件是否成功传输和保存。

四、数据记录及处理

在命令行界面使用“python server.py”命令来启动服务器。服务器端会进入监听阶段,等待建立连接。

新增一个命令行界面。在命令行界面使用“python client.py”命令来启动客户端。客户端会显示相关功能(上传文件和下载文件)。

当客户端启动后。服务器端就会和客户端进行连接。

客户端使用上传文件功能,客户端会发送文件给服务器端,服务器端接收文件并保存到当前工作目录下;客户端在接收到服务器端的确认消息后显示“[+] Uploaded file: test.txt”。

客户端使用上传文件功能,服务器端会显示收到相关文件“[+] Received file: test.txt”。

客户端使用下载文件功能,服务器端会显示发送文件的命令行“[+] Sent file: test.txt”。

当客户端退出连接后,服务器端会进行提醒,显示“远程主机强迫关闭了一个现有的连接”。

当服务器端退出连接后,客户端也会进行提醒,显示“远程主机强迫关闭了一个现有的连接”。

五、 实验结论及问题讨论

实验结论

在本次实验中,通过实现基于TCP协议的文件传输功能,我验证和理解了以下原理和技术:

1.套接字编程原理:理解了套接字编程的基本原理,包括如何通过套接字建立客户端与服务器之间的通信连接。

2.TCP协议的应用:掌握了使用TCP协议进行可靠数据传输的方法,包括数据分块、发送和接收数据的流程等。

3.文件操作与网络传输:学习了如何在Python中进行文件的读取、写入和传输,以及处理文件路径和名称的方法。

4.异常处理与稳定性:实现了基本的异常处理机制,提高了程序的稳定性和健壮性,例如处理文件不存在、连接中断等情况。

问题讨论

1.文件传输的安全性:没有考虑数据加密和身份验证。解决方法:可以引入SSL/TLS进行数据加密,使用身份验证机制确保通信安全。

2.性能优化:对于大文件的传输可能效率不高。解决方法:可以考虑实现断点续传功能、使用多线程或异步IO来提高并发处理能力,或者采用更高效的数据传输方式如UDP。

3.跨平台兼容性:未测试在不同操作系统下的兼容性。解决方法:应在多个操作系统上进行测试,确保程序在各种环境下正常运行。

4.并发处理:可能存在阻塞问题,特别是在多个客户端同时连接时。解决方法:可以使用多线程或异步编程模型来处理多个并发连接,提高程序的并发处理能力。

改进和扩展的讨论

1.安全性增强

改进:引入SSL/TLS协议,对数据进行加密传输,确保通信的安全性。

增加功能:增加用户身份验证机制,防止未授权的访问和操作。

2.性能优化

改进:采用更高效的数据传输方式,如使用UDP协议进行文件传输,适用于对实时性要求不高但带宽要求较高的场景。

增加功能:实现断点续传功能,允许在网络中断后能够从断点处继续传输文件。

3.跨平台兼容性

改进:确保在不同操作系统和不同网络环境下的兼容性,处理好路径分隔符和文件系统差异。

增加功能:实现自动检测和适配不同操作系统的功能,使程序更加灵活和智能。

4.并发处理

改进:采用多线程或异步编程模型,提高程序的并发处理能力,支持多个客户端同时连接和传输。

增加功能:实现连接池管理,有效管理和复用连接资源,减少系统开销和提升响应速度

相关链接

计算机网络实验1之局域网组建

计算机网络实验2之交换机配置

计算机网络实验3之路由器配置

如果对您有帮助的话,能否支持一下博主?
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇