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 29 Python
使用requests库制作Python爬虫
Mar 25 Python
详解Numpy中的广播原则/机制
Sep 20 Python
python 自定义对象的打印方法
Jan 12 Python
Django基础三之视图函数的使用方法
Jul 18 Python
python [:3] 实现提取数组中的数
Nov 27 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
Python打印特殊符号及对应编码解析
May 07 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
基于python实现图片转字符画代码实例
Sep 04 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
python中封包建立过程实例
Feb 18 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脚本数据库功能详解(中)
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
7个jQuery最佳实践
2016/01/12 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
了解前端理论:rscss和rsjs
2019/05/23 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
Python实现的最近最少使用算法
2015/07/10 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python中hashlib模块用法示例
2017/10/30 Python
Python 列表的清空方式
2020/01/13 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
杭州联环马网络笔试题面试题
2013/08/04 面试题
冬季安全检查方案
2014/05/23 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
师德师风剖析材料
2014/09/30 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
学子宴致辞大全
2015/07/27 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers