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时间戳与时间字符串互相转换实例代码
Nov 28 Python
Python列表list数组array用法实例解析
Oct 28 Python
Python 装饰器深入理解
Mar 16 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
python list多级排序知识点总结
Oct 23 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
如何在python中执行另一个py文件
Apr 30 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python自动发送和收取邮件的方法
Aug 12 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
python 匿名函数与三元运算学习笔记
Oct 23 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
第十二节--类的自动加载
2006/11/16 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
图片按比例缩放函数
2006/06/26 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
Python高效编程技巧
2013/01/07 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
python 调用HBase的简单实例
2016/12/18 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python 实现任务管理清单案例
2020/04/25 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
实习生自我评价
2014/01/18 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技