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的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
在双python下设置python3为默认的方法
Oct 31 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
flask框架url与重定向操作实例详解
Jan 25 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python之matplotlib绘制折线图
Apr 13 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调用数据库的存贮过程!
2006/10/09 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
python中的列表和元组区别分析
2020/12/30 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
职业教育毕业生求职信
2013/11/09 职场文书
祖国在我心中演讲稿
2014/01/15 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技