Python实现TCP通信的示例代码


Posted in Python onSeptember 09, 2019

使用socket实现tcp通信,需导入socket模块

1、服务端

主要步骤:

(1)创建socket:socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

family:AF_INET , AF_INET6, AF_UNIX, AF_CAN, AF_PACKET,  AF_RDS

type:SOCK_STREAM , SOCK_DGRAM, SOCK_RAW,或者其他SOCK_*

proto:一般使用默认值0

fileno:一般使用默认值

(2)绑定IP和端口号:socket.bind(address)

address:使用(host,port)元组即可

(3)监听:socket.listen([backlog])

backlog:就理解为最大连接数

(4)接受连接:socket.accept()

返回(conn,address)元组,分别是已连接客户端的socket对象和地址

(5)发送/接受数据:socket.recv(bufsize[, flags])/socket.send(bytes[, flags])

bufsize:接收的数据最大字节数

bytes:需要发送的数据字节数

(6)关闭连接:socket.close()

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:tcpserver.py
 
import socket
import time
MaxBytes=1024*1024
 
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.settimeout(60)
host = '127.0.0.1'
#host = socket.gethostname()
port = 11223
server.bind((host, port))    # 绑定端口
 
server.listen(1)           # 监听
try:
  client,addr = server.accept()     # 等待客户端连接
  print(addr," 连接上了")
  while True:
    data = client.recv(MaxBytes)
    if not data:
      print('数据为空,我要退出了')
      break
    localTime = time.asctime( time.localtime(time.time()))
    print(localTime,' 接收到数据字节数:',len(data))
    print(data.decode())
    client.send(data)
except BaseException as e:
  print("出现异常:")
  print(repr(e))
finally:
  server.close()          # 关闭连接
  print("我已经退出了,后会无期")

这个实例没有创建其他线程,也只接收一个客户端的连接;为了能手动结束或自动结束accept和recv的阻塞,设置了超时60秒,并将主体部分放入到try语句中;将socket的关闭放到finally块中,可以防止程序异常退出,而导致没有调用close函数。

2、客户端

主要步骤:

(1)创建socket:socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

(2)连接:socket.connect(address)

address:使用(host,port)元组即可

(3)发送/接受数据:socket.recv(bufsize[, flags])/socket.send(bytes[, flags])

(4)关闭连接:socket.close() 

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:tcpclient.py
 
import socket
import time
MaxBytes=1024*1024
host ='127.0.0.1'
port = 11223
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.settimeout(30)
client.connect((host,port))
while True:
  inputData=input();     #等待输入数据
  if(inputData=="quit"):
    print("我要退出了,再见")
    break
  sendBytes = client.send(inputData.encode())
  if sendBytes<=0:
    break;
  recvData = client.recv(MaxBytes)
  if not recvData:
    print('接收数据为空,我要退出了')
    break
  localTime = time.asctime( time.localtime(time.time()))
  print(localTime, ' 接收到数据字节数:',len(recvData))
  print(recvData.decode())
client.close()
print("我已经退出了,后会无期")

以上客户端连接成功后等待用户输入,然后将输入信息发送到服务端,服务端将数据原样返回给客户端,如果客户端输入quit就会跳出循环并关闭socket,这时服务端recv会返回空从而跳出循环并关闭socket。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 自动提交和抓取网页
Jul 13 Python
Python中的类学习笔记
Sep 23 Python
Python Queue模块详解
Nov 30 Python
对pandas replace函数的使用方法小结
May 18 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
在Python中表示一个对象的方法
Jun 25 Python
Python动态导入模块和反射机制详解
Feb 18 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
python中rc1什么意思
Jun 19 Python
python打开音乐文件的实例方法
Jul 21 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 Python
Python3使用PySynth制作音乐的方法
Sep 09 #Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 #Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 #Python
pymysql模块的使用(增删改查)详解
Sep 09 #Python
Django之模板层的实现代码
Sep 09 #Python
Django模板语言 Tags使用详解
Sep 09 #Python
Python中turtle库的使用实例
Sep 09 #Python
You might like
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
运动会演讲稿
2014/05/07 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
办公室主任个人总结
2015/02/28 职场文书
贷款收入证明范本
2015/06/12 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
2016年五一促销广告语
2016/01/28 职场文书
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android