参考于: python cs架构实现简单文件传输
原文中程序运行有误,在此做修改与解释,如下: 功能说明:
共2个py文件分别为server和client端,采用socket进行通信。提供两种功能:“dir“ 命令用于显示服务器端可下载文件名;“get/put+文件名“ 命令用于与服务器端进行下载或发送数据交换。
Socket解释
服务器上socket编写步骤:
1.调用socket函数创建socket对象,如:
socket_server = socket.socket(family,type)
family参数代表地址家族,可为AF_INET(Internet通信)或AF_UNIX(同一台机器上进程间通信)。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
2.使用socket对象的bind方法,将socket绑定到指定地址,如:
socket_server.bind(address)
由AF_INET所创建的套接字,address必须是一组双元素元组,格式为(host,port)。
3.使用socket对象的listen方法接受连接请求,如:
socket_server.listen(backlog)
backlog指定最多允许多少个客户连接到服务器,至少为1,如果达到设定值,则拒绝接受新请求。
4.服务器套接字通过socket对象的accept方法等待客户请求一个连接,如:
connection,address = socket_server.accept()
运行accept方法后,socket进入“waiting”状态,等待客户请求连接。当客户请求连接时,accept方法建立连接并返回服务器,返回一组含两个元素的元组(connection,address)。 connection是新的socket对象,服务器必须通过这个新的对象与客户端进行通信 ;address是客户端的Internet地址。
5.处理阶段,服务器和客户端通过“send”和“recv”方法通信:
服务器调用send,并采用 二进制 形式向客户发送信息。send方法返回已发送的字符个数。
服务器使用recv方法从客户端接受信息,调用recv时,服务器必须指定一个整数来表示可通过本次方法调用来接受的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,它表示收到的数据。如果发送数据量超过recv所允许,数据会被截断。多余的数据将缓冲到接收端。以后调用recv时,多余的数据会从缓冲区删除。
6.传输结束,调用socket对象的close方法关闭连接,如:
connection.close() socket_server.close()
注意:这里先关闭accept创建的新socket(connection)然后关闭服务器端socket(socket_server)
客户端上socket编写步骤:
1.创建一个socket以连接服务器,如:
socket_client = socket.socket(family,type)
2.使用connect方法连接服务器,对于AF_INET而言链接格式如:
socket_client.connect((host,port))
host代表主服务器主机名或IP,port为服务器进程所绑定的端口号。
3.处理阶段,客户端和服务器端通过send与recv方法进行通信 4.传输结束,调用close方法关闭连接,如:
socket_client.close()
注意这里的socket_client是第一步创建的对象,而服务器端使用的是accept创建的新socket(connection)
关于TCP的三次握手建立连接和四次挥手断开连接这里不做叙述(彻底讲解我功夫不到家,不敢乱说),把图转来大家看一下(这个感觉很基础, 但很重要):
三次握手
四次挥手
程序如下:
服务器端:
环境与服务器配置信息
接收文件方法
发送文件方法
处理命令1(接收、发送)方法
处理命令2(显示可下载文件)方法
服务器端运行主体
客户端:
环境与服务器配置
接收文件方法
发送文件方法
确认服务器端消息方法
处理命令1(接收、发送)方法
处理命令2(显示可下载文件)方法
客户端运行主体
运行说明:
1.首先建立server.py和client.py文件,并分别置于两个不同的位置,如图:
Server文件夹及其py文件
Client文件夹及其py文件
在Server文件夹下放一个或多个文件用于下载(我这里是4个不同类型的文件以供下文dir指令调用)
在Client文件下放一个或多个文件用于上传(我这里是一个word文本)
2.在Server目录下运行server.py,等待客户端发送连接请求:
服务器端等待连接请求
3.在Client目录下运行client.py,向服务器端发送连接请求:
客户端发送请求 & 服务器端连接成功
注意:先启动服务器,再启动客户端,这个为什么不用多说吧?
4.在客户端输入“dir”指令,查看可下载目录文件:
“dir”指令
注:这里我用“\t“即制表符来控制显示格式,但不知道为啥第一个文件后会自动换行,暂且放着不去管它(不影响通信功能)
5.在客户端输入“get”指令,下载服务器中指定文件:
“get 射频仿真.pptx“指令
“射频仿真.pptx”下载成功
6.在客户端输入“put”指令,上传指定文件到服务器:
“put 天线15.doc”指令
“天线15.doc”上传成功
7.在客户端输入“close”指令,关闭连接,服务器进入监听状态:
“close”指令
注意几点:
1.send方法的第一个参数是二进制数据,使用bytes(字符串,encoding='utf-8')将字符串改为二进制进行发送
2.在做指令判断的时候,需要将“get”、“put”等指令转为二进制,才能与接收到的指令进行判断,这里不将二进制转为字符串(这样易于理解)的原因是,我没找到一个简单的方法让二进制转str(我不会)
3.理清楚创建流程后,主要的困难就是转换数据格式,哪里需要转哪里不需要,自己写一遍,再debug一会儿就会弄明白了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍C#实现Socket通信的解决方法,包括了C#实现Socket通信的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例详述了C#实现Socket通信的解决方法,具体实现步骤如下: 1、首先打开VS新建两个控制台应用程序: ConsoleApplication_socketServer和ConsoleApplication_socketClient。 2、在Console
本文向大家介绍python实现简单socket通信的方法,包括了python实现简单socket通信的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现简单socket通信的方法。分享给大家供大家参考,具体如下: 刚刚开始接触python,实现了一个helloworld程序---关于udp协议的socket通信demo。 首先服务端这边的实现如下: 其中,host置为空,
本文向大家介绍Java 实现简单Socket 通信的示例,包括了Java 实现简单Socket 通信的示例的使用技巧和注意事项,需要的朋友参考一下 Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 Java socket 简单用法。 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protoc
本文向大家介绍Python socket实现的简单通信功能示例,包括了Python socket实现的简单通信功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python socket实现的简单通信功能。分享给大家供大家参考,具体如下: 套接字(socket)是计算机网络数据结构,在任何类型的通信开始之前,网络应用程序必须创建套接字,可以将其比作电话的插孔,没有它将无法进行通信 常
本文向大家介绍C#的Socket实现UDP协议通信示例代码,包括了C#的Socket实现UDP协议通信示例代码的使用技巧和注意事项,需要的朋友参考一下 今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础。众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层。与TCP协议同层,都是提供信息的传输服务,但与TCP最
本文向大家介绍node实现socket链接与GPRS进行通信的方法,包括了node实现socket链接与GPRS进行通信的方法的使用技巧和注意事项,需要的朋友参考一下 业务背景 最近接到一个需求,在微信公众号界面设计一个独立界面,界面上有 A 电机进、A 电机退、B 电机进、B 电机退 4 个按钮,点击对应按钮,云平台发送不同的代码给电机本地的控制器,控制电机执行不同的动作,电机本地控制器具备GP