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多线程编程方式分析示例详解
Dec 06 Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python函数参数类型*、**的区别
Apr 11 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Python返回数组/List长度的实例
Jun 23 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
Python中新式类与经典类的区别详析
Jul 10 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
python 制作简单的音乐播放器
Nov 25 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中PDO基础教程 入门级
2011/09/04 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
浅析js封装和作用域
2013/07/09 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
基于python中theano库的线性回归
2018/08/31 Python
python3 线性回归验证方法
2019/07/09 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python数学形态学实例分析
2019/09/06 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
python进度条显示之tqmd模块
2020/08/22 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
路政管理专业推荐信
2013/11/11 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
校运会新闻稿
2015/07/17 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript