鱼C论坛

 找回密码
 立即注册
查看: 8213|回复: 29

[技术交流] python标准库之【socket】

[复制链接]
发表于 2017-6-10 21:21:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MSK 于 2017-6-10 21:26 编辑

上一篇:
        threading模块拾遗




socket模块

写一聊天室和你的小伙伴耍耍



socket通常也称作”套接字“。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket 是网络连接端点。例如当你的Web浏览器请求www.fishc.com上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.fishc.com的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听。两端使用各自的socket来发送和 接收信息。


socket模块提供了几个函数用于使用主机名和地址来工作:
        gethostname() 返回运行程序所在的计算机的主机名:
  1. #>>> import socket
  2. #>>> socket.gethostname()
  3. #'李嘉图的计算机'
  4. #>>>
复制代码



        gethostbyname(name) 尝试将给定的主机名解释为一个IP地址
  1. #>>> #socket.gethostbyname('www.fishc.com')
  2. #'101.37.44.185'
  3. #>>> socket.gethostbyname('李嘉图的计算机')
  4. #'192.168.1.104'
  5. #>>>
复制代码

        ps:首先将检查当前计算机是否能够解释。如果不能,一个解释请求将发送给一个远程的DNS服务器(远程的DNS服务器 还可能将解释请求转发给另一个DNS服务器,直到该请求可以被处理)。gethostbyname函数返回这个IP地址或在查找失败后引发一个异常。
        拓展;
        gethostbyname_ex(name)返回一个包含三个元素的元组 :
        (给定地址的主要的主机名同一IP地址的可选的主机名的一个列,同一主机的同一接口的其它IP地址的一个列表)
  1. >>> #>>>socket.gethostbyname_ex('www.fishc.com')
  2. #('bbgaws7ldwotai4akucb7ckfsnvzoz6m.aliyunwaf.com', ['www.fishc.com'], ['101.37.44.185'])
复制代码



        gethostbyaddr(address)函数的作用与gethostbyname_ex相同,只是你提供给它的参数是一个IP地址字符串


        getservbyname(service,protocol)函数要求一个服务名(如'telnet'或'ftp')和一个协议(如'tcp'或'udp'),返回服务所使用的端口号:
  1. #>>>socket.getservbyname('http','tcp')
  2. #80
  3. #>>>socket.getservbyname('telnet','tcp)
  4. #23
复制代码






        socket通信
        import socket

        1. socket()

  1. socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
复制代码


        (1)family = AF_INET表示服务器之间的通信。

       

        (2)fmily = AF_UNIX表示Unix不同进程间的通信。

       

        (3)type = SOCK_STREAM表示TCP连接。

       

        (4)type = SOCK_DGRAM 表示UDP连接。




        ps: 2, 3, 4 方法用于服务端
        2. bind()

        sk.bind(address)

        将地址与socket绑定。address(host IP,端口号),address必须是个元组。



        3. listen()

        listen(backlog)

        监听客户端的连接。backlog为可选参数,表示最大等待连接数量。



        4.accept()

        接受连接并返回(conn,address)。其中conn表示客户端的sk对象,
       

        示例:
  1. sk = socket.socket()
  2. address = ('127.0.0.1',9080)
  3. sk.bind(address)
  4. sk.listen(5)
  5. conn,addr = sk.accept()
  6. print(sk)
  7. print(conn)
  8. print(addr)

  9. 输出结果:
  10. <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9080)>
  11. <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9080), raddr=('127.0.0.1', 35066)>
  12. ('127.0.0.1', 35066)
复制代码




        5.recv()

        sk.recv(bufsize)

        接收数据。其中bufsize表示最大可接收的数据大小。



        6.connect()

        sk.connect(address)

        连接指定地址的socket。address用元组表示。



        7.send()

        sk.send(data)

        将data发送给连接的socket。



        8.sendall()

        与send类似,内部通过递归调用send()方法,尝试将所有数据发送出去。

        9.sendto()

        sk.sendto(data,addr)
        可指定远端地址



        notice!
        TCP(SOCK_STREAM),需要连接到远程主机才可以发送数据,发送数据用send(b'字符')
        UDP(SOCK_DGRAM),不需要连接,直接发送数据,发送数据用sendto(b'字符',(ip,port))
       


        10.settimeout(timeout)

        设置超时。



        11.getpeername()

        返回远端socket的地址(address,port)。



        12.getsockname()

        返回自己的socket地址(address,port)。



        13.fileno()

        套接字的文件描述符。




        示例:
        利用socket模块进行通信
        服务端:
  1. sk = socket.socket()
  2. address = ('127.0.0.1',9080)
  3. sk.bind(address)
  4. sk.listen(5)
  5. conn,addr = sk.accept()
  6. data = conn.recv(1024)
  7. print(str(data,'utf8'))
复制代码

        客户端:
  1. sk = socket.socket()
  2. address = ('127.0.0.1',9080)
  3. sk.connect(address)
  4. inp = input('>>')
  5. sk.send(bytes(inp,'utf8'))
复制代码




                               
登录/注册后可看大图


        进阶版:
       
游客,如果您要查看本帖隐藏内容请回复





       
黏包现象

       
游客,如果您要查看本帖隐藏内容请回复

       

       
简单的文件传输

       
游客,如果您要查看本帖隐藏内容请回复








评分

参与人数 2荣誉 +2 鱼币 +10 收起 理由
歌者文明清理员 + 2 + 2 无条件支持楼主!
小甲鱼 + 8 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-10 23:33:36 | 显示全部楼层
前不久刚从图书馆借来《python网络编程基础》,正在学,第一章讲的就是套接字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-11 10:54:14 From FishC Mobile | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-17 20:01:04 | 显示全部楼层
回帖。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-27 12:00:44 | 显示全部楼层
谢谢楼主的分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 13:16:41 | 显示全部楼层
看看~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-17 21:50:16 | 显示全部楼层
来看简单的文件传输
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-11 16:25:48 | 显示全部楼层
谢谢楼主,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-3 19:56:28 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-9 17:15:46 | 显示全部楼层
战争迷雾驱散
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 11:01:21 | 显示全部楼层
学习了,感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-5 13:29:00 | 显示全部楼层
好的,學習到了,!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-22 20:24:47 | 显示全部楼层
学学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-4 20:49:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-5 07:47:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-5 09:34:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-6 20:35:20 | 显示全部楼层
谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-6 16:44:15 | 显示全部楼层
写的很哟用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-6 16:59:06 | 显示全部楼层
你叫李嘉图,小甲鱼叫李佳宇,说,你跟小甲鱼什么关系,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 14:12:12 | 显示全部楼层
标准库是不是默认安装好的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 00:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表