博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python Socket
阅读量:5107 次
发布时间:2019-06-13

本文共 2081 字,大约阅读时间需要 6 分钟。

Python 使用Socket提供对TCP / UDP网络通信的支持。

TCP

client

TCP是带连接的可靠通信协议。创建TCP连接时,主动发起连接的称为客户端,被动响应连接称为服务器。

示例,请求博客园首页:

import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('www.cnblogs.com',80))s.send(b'GET / HTTP/1.1\r\nHost: www.cnblogs.com\r\nConnection: close\r\n\r\n')# receivebuf = list()while True:    d = s.recv(1024)    if d:        buf.append(d)    else:        breakprint(buf)s.close()

说明:

  • socket.socket()

建立socket连接。

socket.AF_INET代表使用IPv4协议,socket.AF_INET6使用更新的IPv6协议。

SOCK_STREAM指定使用面向流的TCP协议。

  • s.connect()

进行socket连接,参数为包含url和port的元组。

  • s.send(str)

通过socket发送数据。

  • s.recv(max)

接收返回的数据,max指定最大字节数。

server

服务端程序监听接口,拦截请求然后进行响应。

先编写一个client:

import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('127.0.0.1', 8081))print(s.recv(1024).decode('utf-8'))s.send('Finley')s.close()

server代码:

import socketimport threadingdef respond(sock, addr):    buf = list()    while True:        d = sock.recv(1024)        if d:            buf.append(d)        else:            break    data = 'Hello, ' + buf    sock.send(data)if __name__ == '__main__':    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    s.bind(('127.0.0.1', 8081))    s.listen(5)    while True:        sock, addr = s.accept()        s.send('Hello from server')        t = threading.Thread(target=respond, args=(sock, addr))        t.start()    s.close()

很多地方与client一致,主要多了监听端口所需的API:

  • bind()

接受一个包含URL和port的元组作为参数,绑定该端口

  • listen(max)

执行监听, 阻塞式调用max为最大连接数

  • accept()

建立连接

UDP

UDP是无连接的用户数据报协议,通常用来发送要求速度快不要求可靠到达的数据,如检测用户是否在线。

UDP的socket为SOCK_DGRAM,udp无需连接,服务器无需绑定接口进行监听。

client:

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)data = 'hello's.sendto(data, ('127.0.0.1', 9999))print(s.recv(1024).decode('utf-8'))s.close()

使用sendto(data, addr_tuple)发送数据报

server:

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(('127.0.0.1', 9999))print('bind udp on 9999')data, addr = s.recvfrom(1024)print('Received from %s:%s.' % addr)s.sendto(b'Hello, %s!' % data, addr)    s.close()

使用recvfrom(max)接收发送来的数据。

转载于:https://www.cnblogs.com/Finley/p/5297566.html

你可能感兴趣的文章
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
视频:"我是设计师"高清完整版Plus拍摄花絮
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
iframe跨域与session失效问题
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
Hash和Bloom Filter
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>