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获取当前日期和时间的方法
Apr 30 Python
Python字符串匹配算法KMP实例
Jul 18 Python
python list转矩阵的实例讲解
Aug 04 Python
使用Python实现在Windows下安装Django
Oct 17 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
PHP安全性漫谈
2012/06/28 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
python常量折叠基础知识点讲解
2021/02/28 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
建筑设计学生的自我评价
2014/01/16 职场文书
留学推荐信中文范文三篇
2014/01/25 职场文书
委托协议书范本
2014/04/22 职场文书
事业单位考核材料
2014/05/21 职场文书
国企干部对照检查材料
2014/08/22 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
vue实现移动端div拖动效果
2022/03/03 Vue.js
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python