python3利用Socket实现通信的方法示例

参考于: 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一会儿就会弄明白了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python3 socket同步通信简单示例

    本文实例讲述了Python3 socket同步通信.分享给大家供大家参考,具体如下: 本文比较简单,适合入门用,作个笔记,方便日后抄写 一个服务端,一个客户端,而且是阻塞方式,一次只能接受一个客户端连接并通信噢. 客户端发送'bye', 结束与服务端的通信,如果发送'shutdown',服务端将会关闭自己! 服务端代码: from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZE = 1024 ADDR =

  • python3利用Socket实现通信的方法示例

    参考于: python cs架构实现简单文件传输 原文中程序运行有误,在此做修改与解释,如下: 功能说明: 共2个py文件分别为server和client端,采用socket进行通信.提供两种功能:"dir" 命令用于显示服务器端可下载文件名:"get/put+文件名" 命令用于与服务器端进行下载或发送数据交换. Socket解释 服务器上socket编写步骤: 1.调用socket函数创建socket对象,如: socket_server = socket.soc

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • Python3简单实现串口通信的方法

    如下所示: import serial import sys import os import time import re def wait_for_cmd_OK():     while True:         line = ser.readline()         try:             print(line.decode('utf-8'),end='')         except:             pass         if ( re.search(b'

  • php实现与python进行socket通信的方法示例

    本文实例讲述了php实现与python进行socket通信的方法.分享给大家供大家参考,具体如下: 设计目的 通过前端页面发起请求交给php,php创建socket请求交给Python脚本,然后执行完毕之后,返回给前端. index.html <html> <head> <title>test</title> <script> g_xmlHttpReq = new XMLHttpRequest(); function onReplyCallbac

  • Java Socket实现单线程通信的方法示例

    本文实例讲述了Java Socket实现单线程通信的方法.分享给大家供大家参考,具体如下: 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用spring,其中就可以支持很多种远程连接的操作,另外jboss的remoting也是不错的选择,还有Apache的Mina等等,但是在有些时候一些特殊情况仍然逃脱不了直接写Socket的情况,比如公司内部一些莫名其妙的游戏规则. 废话不说了,下面就看看如果自己写Socket应该怎么做吧. 首先是写一个Server类,这

  • python利用拉链法实现字典方法示例

    前言 字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法. 在Python中怎样用列表实现字典? 用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办? 最简单的办法就是使用拉链法. 拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好, num的数足够大,就能够保证列表中的每一

  • PHP实现websocket通信的方法示例

    本文实例讲述了PHP实现websocket通信的方法.分享给大家供大家参考,具体如下: 执行方法: 首先先修改server.php与index.html的ip 通过命令行执行 [php路径]\php.exe "[文件路径]\server.php" 然后通过浏览器打开index.html server.php <?php include 'websocket.class.php'; $config=array( 'address'=>'192.168.0.200', 'por

  • Python利用BeautifulSoup解析Html的方法示例

    介绍 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了.然后,你仅仅需要说明一下原始编码方式就可以了. Beautiful

  • 利用PHP_XLSXWriter代替PHPExcel的方法示例

    前言 本文主要给大家介绍的是关于利用PHP_XLSXWriter代替PHPExcel的方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 二者有何区别? PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,这也是PHP至今最通用的Excel处理工具,但是它有一个非常致命的缺点: 特别占内存,对大批量的表格数据几乎会让人累觉不爱,处理速度非常慢,但是它功能非常丰富,API非常多,所以在导

  • Python3解决棋盘覆盖问题的方法示例

    本文实例讲述了Python3解决棋盘覆盖问题的方法.分享给大家供大家参考,具体如下: 问题描述: 在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖所有棋盘上的其余所有方格,不能重叠. 代码如下: def chess(tr,tc,pr,pc,size): global mark global table mark+=1 count=mark if size==1: return half=size//2 if pr<tr+half and pc<tc+half: c

随机推荐