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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Django视图、传参和forms验证操作
Jul 15 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 25 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
c#中的实现php中的preg_replace
2009/12/21 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
php+mysql数据库查询实例
2015/01/21 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
类似框架的js代码
2006/11/09 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
ES6对象操作实例详解
2020/05/23 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python装饰器初探(推荐)
2016/07/21 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
python实现人脸签到系统
2020/04/13 Python
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
六道php面试题附答案
2014/06/05 面试题
高中毕业自我鉴定
2013/12/16 职场文书
中医专业职业生涯规划书范文
2014/01/04 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
责任书范本
2014/08/25 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
MySQL数据库简介与基本操作
2022/05/30 MySQL