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编程生成随机用户名及密码的方法示例
May 05 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python 重定向获取真实url的方法
May 11 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Python数据清洗工具之Numpy的基本操作
Apr 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压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
js实现简单的轮播图效果
2020/12/13 Javascript
Python3.5文件修改操作实例分析
2019/05/01 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
浅析Python面向对象编程
2020/07/10 Python
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
银行会计职员个人的自我评价
2013/09/29 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
大专学生求职信
2014/07/04 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
保送生自荐信
2015/03/06 职场文书
主持稿开场白
2015/06/01 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
计算机实训心得体会
2016/01/14 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android