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的类变量和成员变量用法实例教程
Aug 25 Python
在Python中测试访问同一数据的竞争条件的方法
Apr 23 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
python 批量修改/替换数据的实例
Jul 25 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
python视频按帧截取图片工具
Jul 23 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
Python urllib.request对象案例解析
May 11 Python
关于Keras Dense层整理
May 21 Python
python 实现图像快速替换某种颜色
Jun 04 Python
python利用后缀表达式实现计算器功能
Feb 22 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连接SQLServer2005 的问题解决方法
2010/07/19 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python K近邻算法的kd树实现
2018/09/06 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
委托书的格式
2014/08/01 职场文书
庆六一宣传标语
2014/10/08 职场文书
质量整改报告范文
2014/11/08 职场文书
文书工作总结(范文)
2019/07/11 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android