备案 控制台
开发者社区 开发与运维 文章 正文

python中socket与socketserver模块简单入门使用

简介:

一、socket模块
socket又叫套接字,是网络编程中的一个基本组件,是两个端点的程序之间的“信息通道”程序可分布在不同的计算机上(通过网络连接),通过socket套接字相互发送信息。python中的大多数的网络编程都 隐藏了socket模块的基本细节。
python中通过socket模块完成网络编程的套接字实现,一个套接字就是socket模块中的socket类的一个实例。socket实例化需要三个参数分别是family(ipv4,ipv6,unix)其中默认是ipv4 "socket.AF_INET",第二个参数是流,默认是socket.SOC_STREAM表示tcp,或socket.SOCK_DGRAM,第三个参数是协议,默认是0,使用默认即可。因此实际上实例化出一个套接字,只需要二个参数。

socket通讯原理:
python中socket与socketserver模块简单入门使用

socket函数
python 3.x下发送的内容必须是byte类型,2.x是字符串
python中socket与socketserver模块简单入门使用
python中socket与socketserver模块简单入门使用

二、socket简单通讯
环境说明:ubuntu 16.04 python 3.5.2 模拟的服务器和客户端均在一台机器上(可以在不同机器上,只要保障网络连接)

先来看一个简的服务器与客户端的socket通讯
功能:服务器侦听等待连接,客户端连接后发送连接信息,之后客户端发送的任何信息,服务器端原样返回客户端。
代码如下:
1、srv.py

import socket
sk = socket.socket()
#print(sk)
HOST = '127.0.0.1'
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)

sk.bind(ADDR)
sk.listen(5)
print("waiting...")

while True:
    conn,addr = sk.accept()
    ip,port = addr
    print("Got connection from",addr)
    conn.send(bytes("connected from %s:%s." %addr,"utf-8"))
    while True:
        data = conn.recv(BUFSIZ)
        if not data:
            break                                     #直接回车退出本次连接
        print(data)
        conn.send(data)

conn.close()

cli.py

import socket
HOST = '127.0.0.1'
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)
sk = socket.socket()
sk.connect(ADDR)
print(sk.recv(BUFSIZ))
while True:
    inp = input(">>>")
        if not inp:                                       #忽略空格回车
            continue
    sk.send(bytes(inp,"utf-8"))
    print(sk.recv(BUFSIZ))

运行结果:
python中socket与socketserver模块简单入门使用
python中socket与socketserver模块简单入门使用

以上是一个最简单的socket网络通讯。以上可以发现双方通讯时一发一收,或一收一发,总是成对出现,但有一个缺点,就是同时只能给一个客户端提供服务(通讯)其他的客户端只能等待。后面通过socketserver来解决一服务器多客户端同时连接的情况。

三、socket上传文件
在完成基本的通讯后,我们来做一个文件上传的实例。
server端

#coding:utf-8
import socket
import os
sk = socket.socket()
#print(sk)
HOST = '127.0.0.1'            #指定ip
PORT = 2222                     #侦听端口
BUFSIZ = 1024                  #缓存大小
ADDR = (HOST,PORT)

sk.bind(ADDR)                   #套接字ip端 口进行绑定
sk.listen(5)                           #连接等待数,默认5
print("waiting....")
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
    conn, addr = sk.accept()
    print(addr)
    while True:
        data = conn.recv(1024)
        cmd,filename,filesize = (str(data,"utf-8")).split("|")
        path = os.path.join(BASE_DIR,'yuan',filename)
        filesize = int(filesize)

        f = open(path,"ab")
        has_receive = 0
        while has_receive != filesize:
            data = conn.recv(1024)
            f.write(data)
            has_receive+=len(data)
        f.close()

sk.close()

client端

#coding:utf-8
import socket
import os

HOST = '127.0.0.1' 
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)
sk = socket.socket()
sk.connect(ADDR)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
while True:
    inp = input(">>>").strip() #post|12.png
    cmd,path = inp.split("|")
    path = os.path.join(BASE_DIR,path)  ##完整文件路径xxx/12.png
    filename = os.path.basename(path)    ##获取文件名
    file_size = os.stat(path).st_size    #获取文件大小
    file_info = "post|%s|%s" %(filename,file_size)
    sk.sendall(bytes(file_info,"utf-8"))
    f = open(path,'rb')
    has_sent = 0
    while  has_sent != file_size:
        data = f.read(BUFSIZ)
        sk.sendall(data)
        has_sent+=len(data)
    f.close()
    print("上传成功~")
sk.close()

总结:socket通讯的关键是一发一收,无论是服务端先发还是客户端先发,必须是一端发送另一端接收,如果连续发送会出现粘包现象。

四、socketserver实例多并发通讯

server.py

#coding:utf-8
import socketserver    #能实现并发
#并发聊天
class MyServer(socketserver.BaseRequestHandler):
    print("服务端启动...")
    def handle(self):
        while True:
            conn = self.request
            print (self.client_address)
            while True:
                client_data=conn.recv(1024)
                print (str(client_data,"utf8"))
                print ("waiting...")
                server_response=input(">>>")
                conn.sendall(bytes(server_response,"utf8"))
            conn.close()

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',2223),MyServer)
    server.serve_forever()

client.py

#coding:utf-8
import socket

ip_port = ('127.0.0.1',2223)
sk = socket.socket()
sk.connect(ip_port)
print ("客户端启动:")
while True:
    inp = input('>>>')
    sk.sendall(bytes(inp,"utf-8"))
    if inp == 'exit':
        break
    server_response=sk.recv(1024)
    print (str(server_response,"utf-8"))
sk.close()

执行结果服务器端通过多线程完成并发多客户端“同时”聊天效果。

以上为socket socketserver基本应用。如有不当之处欢迎指正。










本文转自 dyc2005 51CTO博客,原文链接:http://blog.51cto.com/dyc2005/2044166,如需转载请自行联系原作者
余二五
目录
相关文章
妄北y
|
2天前
|
存储 Python
【Python学习篇】Python基础入门学习——Python基础语法(二)
【Python学习篇】Python基础入门学习——Python基础语法(二)
妄北y
9 1
Onebound19970109110
|
2天前
|
数据采集 存储 Web App开发
Python爬虫实战:从入门到精通
Python是开发网络爬虫的首选语言,因其简洁语法和丰富库如requests, BeautifulSoup, Scrapy。爬虫涉及HTTP交互、HTML解析及法律道德问题。以下是爬取豆瓣电影Top250的步骤:确定目标,分析网站,安装必要库(requests, BeautifulSoup),编写代码抓取电影名称、评分和简介,处理异常并优化,如设置请求间隔、使用代理IP和遵循Robots协议。
Onebound19970109110
8 0
做梦都在改BUG
|
3天前
|
数据可视化 API Python
豆瓣评分9.4!堪称经典的Python入门圣经,你还没看过吗?
最理想的新人入门书应该满足两个特点:第一就是内容通俗易懂;第二就是要有实战,能够让读者在学完之后知道具体怎么用。 今天给小伙伴们分享的这份Python入门手册,在为初学者构建完整的Python语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽又面面俱到。
做梦都在改BUG
11 2
愿天堂没有BUG(公众号同名)
|
3天前
|
开发者 Python
GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?
Python凭借着简单易学、功能强大,已经跃居TIOB编程语言榜首,并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程,是每个Python爱好者面临的首要问题。 今天给小伙伴们带来的是图灵&京东认证的“Python编程入门三剑客”,先看《Python编程从入门到实践》,打好Python入门的底子;再看《Python编程快速上手》,增强用Python处理工作中实际问题的能力;最后看《Python极客项目编程》,用充满想象力的实战案例,充分理解Python编程的奥秘,完成从小白到大神的进化。
愿天堂没有BUG(公众号同名)
9 2
攒了一袋星辰
|
3天前
|
网络协议 Python
python中socket编程
python中socket编程
攒了一袋星辰
8 0
做梦都在改BUG
|
4天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点) 今天给小伙伴们分享一份Python语言及其应用的手册,这份手册主要介绍 Python 语言的基础知识及其在各个领域的具体应用,基于最新版本 3.x。
做梦都在改BUG
9 0
3hvg2zg3cgsi6
|
5天前
|
网络协议 Unix API
24.Python 网络编程:socket编程
24.Python 网络编程:socket编程
3hvg2zg3cgsi6
10 2
3hvg2zg3cgsi6
|
5天前
|
JSON 算法 数据格式
14.Python 模块
14.Python 模块
3hvg2zg3cgsi6
7 0
做梦都在改BUG
|
5天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点) 今天给小伙伴们分享一份Python语言及其应用的手册,这份手册主要介绍 Python 语言的基础知识及其在各个领域的具体应用,基于最新版本 3.x。
做梦都在改BUG
19 4
游客4egshivbqn3ei
|
6天前
|
存储 Unix Shell
Python 模块
Python 模块
游客4egshivbqn3ei
7 1

热门文章

最新文章

  • 1
    【资料下载】Python 第十讲——xpath元素定位获取及爬虫中使用实例
  • 2
    Python 获取视频时长(附代码) | Python工具
  • 3
    如何从 0 开始学 Python 自动化测试开发(一)
  • 4
    Python爬虫入门教程 17-100 CSDN博客抓取数据
  • 5
    Python数据分析之小鲜肉粉丝情况
  • 6
    python如何读取xlsx文件,并指定读取某一列,逐个逐个取出指定列中的值
  • 7
    圣诞树(html,python,matlab)完整源码
  • 8
    python etree.ElementTree 处理,获取instance 对应的 vent 和 IP
  • 9
    Python图片处理库之PIL
  • 10
    Python补充06 Python之道
  • 1
    UNIX域套接字(Unix Domain Socket)在安全性和隐私性
    85
  • 2
    UNIX域套接字(Unix Domain Socket,UDS)之所以高效
    90
  • 3
    【计算机网络】TCP socket编程
    28
  • 4
    套接字(socket)的抽象层
    42
  • 5
    套接字(socket)的端点表示
    35
  • 6
    套接字(Socket)
    27
  • 7
    火山中文编程 -- 实现Socket通信
    28
  • 8
    socket监控进程,并对程序执行有关操作。
    32
  • 9
    【极数系列】Flink集成DataSource读取Socket请求数据(09)
    54
  • 10
    [Java]Socket套接字(网络编程入门)
    42
  • 相关课程

    更多
  • Python Web开发基础
  • Python开发基础入门
  • Python常用数据科学库
  • Python网络爬虫实战
  • Python完全自学手册图文教程
  • Python基础快速入门实战教程
  • 相关电子书

    更多
  • From Python Scikit-Learn to Sc
  • Data Pre-Processing in Python:
  • 双剑合璧-Python和大数据计算平台的结合
  • 相关实验场景

    更多
  • Python新手入门
  • Python入门
  • Python选择及循环结构
  • Python新手入门(Anolis OS)
  • Python网络通信程序典型应用
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司定西网站优化推广哪家好岳阳外贸网站制作推荐张家口SEO按天计费价格柳州网站建设设计价格九江优化报价龙岗网页制作价格衡阳seo网站优化哪家好雅安建网站枣庄设计公司网站报价镇江百度标王报价丹竹头SEO按天计费价格荆州百度seo哪家好衡阳seo和田关键词排名报价东莞企业网站建设价格大理网站建设多少钱鞍山优秀网站设计公司固原模板网站建设北海百姓网标王推广报价上饶品牌网站设计多少钱临沂百度爱采购报价平顶山模板制作推荐汕头网站设计模板茂名网站建设黄南企业网站建设报价喀什网站优化按天计费鞍山模板制作推荐淮北百度网站优化多少钱运城SEO按天收费价格武汉网站开发价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化