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发送HTTP请求的方法小结
Jul 08 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python实现统计文本文件字数的方法
May 05 Python
python实现数据库跨服务器迁移
Apr 12 Python
Django中间件实现拦截器的方法
Jun 01 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
Python 单例设计模式用法实例分析
Sep 23 Python
python字符串的多行输出的实例详解
Jun 08 Python
如何用Python搭建gRPC服务
Jun 30 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
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
使用Python生成url短链接的方法
2015/05/04 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
有关Python的22个编程技巧
2018/08/29 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
Django实现随机图形验证码的示例
2020/10/15 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
爱国演讲稿500字
2014/05/04 职场文书
化工专业求职信
2014/07/01 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
SQL Server使用导出向导功能
2022/04/08 SQL Server