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 域名分析工具实现代码
Jul 15 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
详解python程序中的多任务
Sep 16 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
virtualenv隔离Python环境的问题解析
Jun 21 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操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python退火算法在高次方程的应用
2018/07/26 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
大一期末自我鉴定
2013/12/13 职场文书
业务员薪酬管理制度
2014/01/15 职场文书
中秋寄语大全
2014/04/11 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
2014年度培训工作总结
2014/11/27 职场文书
医院消毒隔离制度
2015/08/05 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS