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查询Mysql时返回字典结构的代码
Jun 18 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
Python实现将xml导入至excel
Nov 20 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
通过cmd进入python的步骤
Jun 16 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
python实现简单反弹球游戏
Apr 12 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 Python
Python如何用re模块实现简易tokenizer
May 02 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP中GET变量的使用
2006/10/09 PHP
php session 预定义数组
2009/03/16 PHP
php文件上传类完整实例
2016/05/14 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
详解【python】str与json类型转换
2019/04/29 Python
Python中os模块功能与用法详解
2020/02/26 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
python 绘制场景热力图的示例
2020/09/23 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
高中生毕业自我鉴定范文
2013/12/22 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python