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学习笔记之os模块使用总结
Nov 03 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
使用python3实现操作串口详解
Jan 01 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
python入门之井字棋小游戏
Mar 05 Python
详解Python模块化编程与装饰器
Jan 16 Python
Python实现随机爬山算法
Jan 29 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 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
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
asp 的 分词实现代码
2007/05/24 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python编写打字训练小程序
2019/09/26 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
python微信公众号开发简单流程实现
2020/03/09 Python
python数据类型强制转换实例详解
2020/06/22 Python
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
思想品德自我评价
2014/02/04 职场文书
小区消防演习方案
2014/02/21 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
同事打架检讨书
2015/05/06 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书