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中is和id的用法
Apr 03 Python
python 网络编程详解及简单实例
Apr 25 Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 Python
解决Django连接db遇到的问题
Aug 29 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
Python中request的基本使用解决乱码问题
Apr 12 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
linux iconv方法的使用
2011/10/01 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
Python 文件读写操作实例详解
2014/03/12 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
生产部主管岗位职责
2014/01/06 职场文书
护士检查书
2014/01/17 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
聚美优品励志广告词
2014/03/14 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
珍爱生命主题班会
2015/08/13 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书