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中的实例方法、类方法和静态方法
Feb 17 Python
django中的HTML控件及参数传递方法
Mar 20 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
Python----数据预处理代码实例
Mar 20 Python
Python2与Python3的区别实例分析
Apr 11 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
将Python字符串生成PDF的实例代码详解
May 17 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
django解决订单并发问题【推荐】
Jul 31 Python
pandas如何处理缺失值
Jul 31 Python
python图片二值化提高识别率代码实例
Aug 24 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 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
制作美丽的拉花
2021/03/03 冲泡冲煮
有关PHP中MVC的开发经验分享
2012/05/17 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python中as用法实例分析
2015/04/30 Python
python mysql断开重连的实现方法
2019/07/26 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
python 实现两个npy档案合并
2020/07/01 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
中学生校园广播稿
2014/01/16 职场文书
个人实习生的自我评价
2014/02/16 职场文书
植树造林的宣传标语
2014/06/23 职场文书
实习介绍信范文
2015/05/05 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis