Python Socket使用实例


Posted in Python onDecember 18, 2017

Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式

UDP通讯:

Server:

import socket
port=8081
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#从指定的端口,从任何发送者,接收UDP数据
s.bind(('',port))
print('正在等待接入...')
while True:
  #接收一个数据
  data,addr=s.recvfrom(1024)
  print('Received:',data,'from',addr)

Client:

import socket
port=8081
host='localhost'
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(b'hello,this is a test info !',(host,port))

很简单 。下面是TCP方式:

Server:

#-*- coding: utf-8 -*-
from socket import *
from time import ctime

HOST=''
PORT=12345
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)

sock.bind(ADDR)

sock.listen(5)
while True:
  print('waiting for connection')
  tcpClientSock, addr=sock.accept()
  print('connect from ', addr)
  while True:
    try:
      data=tcpClientSock.recv(BUFSIZ)
    except:
      print(e)
      tcpClientSock.close()
      break
    if not data:
      break
    s='Hi,you send me :[%s] %s' %(ctime(), data.decode('utf8'))
    tcpClientSock.send(s.encode('utf8'))
    print([ctime()], ':', data.decode('utf8'))
tcpClientSock.close()
sock.close()

Client:

#-*- coding: utf-8 -*-
from socket import *

class TcpClient:
  HOST='127.0.0.1'
  PORT=12345
  BUFSIZ=1024
  ADDR=(HOST, PORT)
  def __init__(self):
    self.client=socket(AF_INET, SOCK_STREAM)
    self.client.connect(self.ADDR)

    while True:
      data=input('>')
      if not data:
        break
      self.client.send(data.encode('utf8'))
      data=self.client.recv(self.BUFSIZ)
      if not data:
        break
      print(data.decode('utf8'))
      
if __name__ == '__main__':
  client=TcpClient()

上面的TCP方式有个问题,不能退出,好吧,我们改造一下,使这个程序可以发送quit命令以退出:

Server:

#-*- coding: utf-8 -*-
from socket import *
from time import ctime
from time import localtime
import time

HOST=''
PORT=1122 #设置侦听端口
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)

sock.bind(ADDR)

sock.listen(5)
#设置退出条件
STOP_CHAT=False
while not STOP_CHAT:
  print('等待接入,侦听端口:%d' % (PORT))
  tcpClientSock, addr=sock.accept()
  print('接受连接,客户端地址:',addr)
  while True:
    try:
      data=tcpClientSock.recv(BUFSIZ)
    except:
      #print(e)
      tcpClientSock.close()
      break
    if not data:
      break
    #python3使用bytes,所以要进行编码
    #s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))
    #对日期进行一下格式化
    ISOTIMEFORMAT='%Y-%m-%d %X'
    stime=time.strftime(ISOTIMEFORMAT, localtime())
    s='%s发送给我的信息是:%s' %(addr[0],data.decode('utf8'))
    tcpClientSock.send(s.encode('utf8'))
    print([stime], ':', data.decode('utf8'))
    #如果输入quit(忽略大小写),则程序退出
    STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
    if STOP_CHAT:
      break
tcpClientSock.close()
sock.close()

Client:

#-*- coding: utf-8 -*-
from socket import *

class TcpClient:
  #测试,连接本机
  HOST='127.0.0.1'
  #设置侦听端口
  PORT=1122 
  BUFSIZ=1024
  ADDR=(HOST, PORT)
  def __init__(self):
    self.client=socket(AF_INET, SOCK_STREAM)
    self.client.connect(self.ADDR)

    while True:
      data=input('>')
      if not data:
        break
      #python3传递的是bytes,所以要编码
      self.client.send(data.encode('utf8'))
      print('发送信息到%s:%s' %(self.HOST,data))
      if data.upper()=="QUIT":
        break      
      data=self.client.recv(self.BUFSIZ)
      if not data:
        break
      print('从%s收到信息:%s' %(self.HOST,data.decode('utf8')))
      
      
if __name__ == '__main__':
  client=TcpClient()

注:以上代码为Python3。

总结

以上就是本文关于Python Socket使用实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python获取url的返回信息方法
Dec 17 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
python元组的概念知识点
Nov 19 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python输出指定字符串的方法
Feb 06 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
django中嵌套的try-except实例
May 21 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
python 制作磁力搜索工具
Mar 04 Python
浅谈python数据类型及类型转换
Dec 18 #Python
Python字典,函数,全局变量代码解析
Dec 18 #Python
Python语言生成水仙花数代码示例
Dec 18 #Python
Python实现的双色球生成功能示例
Dec 18 #Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 #Python
简单实现python进度条脚本
Dec 18 #Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 #Python
You might like
详谈PHP文件目录基础操作
2014/11/11 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
python实现决策树分类算法
2017/12/21 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python csv模块使用方法代码实例
2019/08/29 Python
python循环输出三角形图案的例子
2019/11/22 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
python 画条形图(柱状图)实例
2020/04/24 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
一份Java笔试题
2012/02/21 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
大学生个人实习的自我评价
2014/02/15 职场文书
中班开学寄语
2014/04/04 职场文书
2015年医德考评自我评价
2015/03/03 职场文书