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中的URLError异常的方法
Apr 30 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
浅析Python基础-流程控制
Mar 18 Python
Python中列表元素转为数字的方法分析
Jun 14 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
Python使用sorted排序的方法小结
Jul 28 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
使用Pytorch搭建模型的步骤
Nov 16 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游戏编程25个脚本代码
2011/02/08 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
Js基础学习资料
2010/11/23 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
js获取内联样式的方法
2015/01/27 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
python 文件转成16进制数组的实例
2018/07/09 Python
python实现文件的备份流程详解
2019/06/18 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
python里反向传播算法详解
2020/11/22 Python
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
国贸专业的职业规划书
2014/03/15 职场文书
社区消防工作实施方案
2014/03/21 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
小学德育工作总结2015
2015/05/12 职场文书
校运会通讯稿
2015/07/18 职场文书
详解Laravel制作API接口
2021/05/31 PHP
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers