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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
django定期执行任务(实例讲解)
Nov 03 Python
python GUI实例学习
Nov 21 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Django和Flask框架优缺点对比
Oct 24 Python
python flask搭建web应用教程
Nov 19 Python
Python新手学习标准库模块命名
May 29 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
5道关于python基础 while循环练习题
Nov 27 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上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php中strtotime函数用法详解
2014/11/15 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
python搭建微信公众平台
2016/02/09 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
python小白切忌乱用表达式
2020/05/29 Python
Python实现GIF图倒放
2020/07/16 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
平面设计专业求职信
2014/08/09 职场文书
主持人大赛开场白
2015/05/29 职场文书
欠条范文
2015/07/03 职场文书
五年级数学教学反思
2016/02/16 职场文书