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之Import 模块
Oct 13 Python
在Django的session中使用User对象的方法
Jul 23 Python
python创建列表和向列表添加元素的实现方法
Dec 25 Python
python操作redis方法总结
Jun 06 Python
详解python配置虚拟环境
Apr 08 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
多重?l件?合查?(二)
2006/10/09 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
PHP代码优化技巧小结
2015/09/29 PHP
Javascript &amp; DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
在vue项目中使用md5加密的方法
2018/09/14 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python3操作mysql数据库的方法
2017/06/23 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Django单元测试工具test client使用详解
2019/08/02 Python
解析python实现Lasso回归
2019/09/11 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
应届毕业生自荐信
2014/05/28 职场文书
大学生个人求职信
2014/06/02 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
校长新学期致辞
2015/07/30 职场文书