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 获取et和excel的版本号
Apr 09 Python
python求斐波那契数列示例分享
Feb 14 Python
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
详谈python read readline readlines的区别
Sep 22 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
python中class的定义及使用教程
Sep 18 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
tensorflow常用函数API介绍
Apr 19 Python
Python函数参数分类原理详解
May 28 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 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编程效率 引入缓存机制提升性能
2010/02/15 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
网页javascript精华代码集
2007/01/24 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
Bootstrap菜单按钮及导航实例解析
2016/09/09 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
Python异常处理总结
2014/08/15 Python
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
wxpython实现图书管理系统
2018/03/12 Python
python实现飞机大战微信小游戏
2020/03/21 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
盛大笔试题
2016/11/05 面试题
门面房租房协议书
2014/08/20 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
闪闪的红星观后感
2015/06/08 职场文书
高中政治教师教学反思
2016/02/23 职场文书
AngularJS实现多级下拉框
2022/03/25 Javascript
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫