Python socket网络编程TCP/IP服务器与客户端通信


Posted in Python onJanuary 05, 2017

Python socket网络编程

初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络编程,依然有好多不太理解的地方,不过想来通过自己不断的摸索,不断地搜寻资料学习,早晚应该会变得通透吧.......

这部分主要使用的模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象,套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。

socket()模块函数

要创建套接字,必须使用 socket.socket()函数,他一般的语法如下

socket(socket_family, socket_type, protocol=0)

其中socket_family是 AF_UNIX或 AF_INET,socket_type 是 SOCK_STREAM 或 SOCK_DGRAM,protocol 通常省略,默认=0.

所以创建 TCP/IP 套接字,可以使用下面的方式调用 socket.socket().

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

同样创建 UDP/IP 套接字,使用下面的方法调用

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

创建 TCP 服务器

创建 TCP 服务器的流程基本如下,并非正真正的代码

ss = socket()          #创建服务器套接字
    ss.bind()              #套接字与地址绑定
    ss.listen()             #监听连接
    inf_loop:             #服务器无限循环
        cs = ss.accepr()   #接受客户端连接
        comm_loop:      #通信循环
            cs.recv()/cs.send()   #对话(接收/发送)
        cs.close()        #关闭客户端套接字
    ss.close()            #关闭服务器套接字(可选)

实际中创建 TCP 服务器基本流程就如上边所说,可能稍有不同但基本思路应该是相通的,下边是真正穿件服务器的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *      #将 socket 属性引入到命名空间

HOST = ''          #这是对 bind()方法的标识表示可以使用任何可用的地址
PORT = 21571      #端口号
BUFSIZ = 1024     #缓冲区大小,1kb
ADDR = (HOST,PORT)   #地址????

tcpSerSocket = socket(AF_INET,SOCK_STREAM)    #创建 tcp 套接字
tcpSerSocket.bind(ADDR)           #将地址绑定到套接字上
tcpSerSocket.listen(5)            #设置并启动套接字监听

while True:        #无限循环,等待客户端连接
  print('waiting for connection...')   
  tcpCliSocket,addr = tcpSerSocket.accept()    #被动接受客户端连接     
  print('...connected from:',addr)

  while True:      #对话循环,等待客户端发送消息
    data = tcpCliSocket.recv(BUFSIZ)   #接收客户端消息
    if not data:     #如果消息是空白,跳出对话循环,关闭当前连接
      break
    tcpCliSocket.send(data)   #如果收到消息,将消息原封不动返回客户端

  tcpCliSocket.close()
tcpSerSocket.close()

创建 TCP 客户端

同上边一样,一个简单的非代码流程

cs = socket()    #创建客户端套接字
    cs.connect()     #尝试连接服务器
    comm_loop:     #通信循环
        cs.send()/cs.recv()  #对话(发送/接收)
    cs.close()       #关闭客户端套接字

实际中创建客户端也是翻译上边的步骤

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *

HOST = 'localhost'    #服务器的主机名
PORT = 21571     #端口号
BUFSIZ = 1024     #缓冲区
ADDR = (HOST,PORT)   #地址

tcpCliSocket = socket(AF_INET,SOCK_STREAM)  #创建客户端套接字
tcpCliSocket.connect(ADDR)     #连接服务器

while True:        #通信循环
  data = input('> ')    #客户端输入信息
  if not data:   #如果输入信息为空,则跳出循环,关闭通信
    break

  data = str.encode(data)      
  tcpCliSocket.send(data)   #发送客户端信息
  data = tcpCliSocket.recv(BUFSIZ)   #接受服务器返回信息
  if not data:    #如果服务器未返回信息,关闭通信循环
    break
  print('get:',data.decode('utf-8'))

tcpCliSocket.close()

当然,这只是最基础的通信,而且关于主机名,端口号之类的东西暂时还不是很懂,目前所做的只是在同一台电脑上通信,端口号也需要一致,如果不同的电脑进行通信该怎么做?我还只是个小白.....

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python代码的打包与发布详解
Jul 30 Python
python统计cpu利用率的方法
Jun 02 Python
python监控文件或目录变化
Jun 07 Python
python 系统调用的实例详解
Jul 11 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
python连接数据库的方法
Oct 19 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
python中uuid模块实例浅析
Dec 29 Python
PyCharm常用配置和常用插件(小结)
Feb 06 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 #Python
python fabric实现远程部署
Jan 05 #Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 #Python
python 捕获shell脚本的输出结果实例
Jan 04 #Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 #Python
python去除空格和换行符的实现方法(推荐)
Jan 04 #Python
python去掉行尾的换行符方法
Jan 04 #Python
You might like
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
js序列化和反序列化的使用讲解
2019/01/19 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
Python中的列表知识点汇总
2015/04/14 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
python之Socket网络编程详解
2016/09/29 Python
Flask之flask-script模块使用
2018/07/26 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
简单了解django缓存方式及配置
2019/07/19 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
美丽的现代设计家具:2Modern
2018/07/26 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
施工安全协议书
2013/12/11 职场文书
竞聘上岗演讲
2014/05/19 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
建筑横幅标语
2014/10/09 职场文书
会计实训报告范文
2014/11/04 职场文书
2015年度物流工作总结
2015/04/30 职场文书
爱国主义电影观后感
2015/06/18 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android