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爬虫之HTTP异常处理
Nov 05 Python
Python中IPYTHON入门实例
May 11 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
python getopt详解及简单实例
Dec 30 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python 文件查找及内容匹配方法
Oct 25 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
Python3几个常见问题的处理方法
Feb 26 Python
【python】matplotlib动态显示详解
Apr 11 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
解决Pycharm 运行后没有输出的问题
Feb 05 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
phpwind中的数据库操作类
2007/01/02 PHP
php使用qr生成二维码的示例分享
2014/01/20 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
整理Python最基本的操作字典的方法
2015/04/24 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
美国社交购物市场:MassGenie
2019/02/18 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
好听的队名和口号
2014/06/09 职场文书
检讨书模板大全
2015/05/07 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技