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是编译运行的验证方法
Jan 30 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
Python reduce函数作用及实例解析
May 08 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
Python logging日志库空间不足问题解决
Sep 14 Python
Python读写锁实现实现代码解析
Nov 28 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
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
学习python (2)
2006/10/31 Python
python 中文乱码问题深入分析
2011/03/13 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
详解Python:面向对象编程
2019/04/10 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
幼儿园父亲节活动方案
2014/03/11 职场文书
项目建议书格式
2014/03/12 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
公务员考察材料范文
2014/12/23 职场文书
公司员工辞职信范文
2015/05/12 职场文书
单位工作证明范本
2015/06/15 职场文书
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技