资讯专栏INFORMATION COLUMN

Python Socket Programming

luqiuwen / 2611人阅读

摘要:中却发生了异常。接收数据使用函数接收数据在中返回的是对象,在中返回的是。注意函数返回的数据长度是小于或者等于参数指定的长度的,要接收到指定长度的数据,需要循环接收数据。当一个被回收时会自动关闭,但是不要依赖这种机制,不需要时就主动的。

本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下。

Python的socket功能封装在socket库中,要使用socket,记得先import socket,socket库的详细介绍参见官方文档。

创建Socket

首先创建一个socket,使用socket库中得socket函数创建。

Pythonimport socket

# create an INET, STREAM socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

例子中创建了一个TCP socket,socket.socket函数的前两个参数的默认值是socket.AF_INETsocket.SOCK_STREAM,创建TCP socket时可以直接写成socket.socket()

连接服务器

使用socket的connect函数连接到服务器,以下几种参数都是合法的。

Pythons.connect(("localhost", 8000))
s.connect(("127.0.0.1", 8000))
s.connect(("www.baidu.com", 80))
发送数据

发送数据有两个方法send和sendall,send不能保证所有的数据都发送完了,它会返回已发送数据的长度,程序要循环发送数据直到所有数据都已发送完毕。

Pythondef mysend(s, msg):
    total_len = len(msg)
    total_sent = 0
    while total_sent < total_len:
        sent = s.send(msg[total_sent:])
        if sent == 0:
            raise RuntimeError("socket connection broken")
        total_sent += sent

sendall能够保证所有的数据都已发送完毕,除非发送过程中出现了错误,它实际上也是循环发送数据直到所有数据发送完成。

这里还要讲一个需要特别注意的地方,从一个例子开始吧:

Pythonimport socket
s = socket.socket()
s.connect(("www.baidu.com", 80))
s.sendall("test")

都是上面讲过的东西,没什么特别的,分别在Python 2和Python 3中执行以上的代码,结果是:

Python# Python 2.7
>>> import socket
>>> s = socket.socket()
>>> s.connect(("www.baidu.com", 80))
>>> s.sendall("test")

Python 2中执行成功。

Python# Python 3.4
>>> import socket
>>> s = socket.socket()
>>> s.connect(("www.baidu.com", 80))
>>> s.sendall("test")
Traceback (most recent call last):
  File "", line 1, in 
TypeError: "str" does not support the buffer interface

Python 3中却发生了异常。

同样的代码换个环境却不能执行了,我没有写错呀,怒砸电脑。好吧,你确实没写错,是环境变了,导致这个结果的变化请移步官方的说明。

接收数据

使用recv函数接收数据:

Pythondata = s.recv(4096)

在Python 3中返回的是bytes对象,在Python 2中返回的是string。注意函数返回的数据长度是小于或者等于参数指定的长度的,要接收到指定长度的数据,需要循环接收数据。

Pythondef myreceive(s, msglen):
    chunks = []
    bytes_recd = 0
    while bytes_recd < msglen:
        chunk = s.recv(min(msglen - bytes_recd, 2048))
        if chunk == b"":
            raise RuntimeError("socket connection broken")
        chunks.append(chunk)
        bytes_recd = bytes_recd + len(chunk)
    return b"".join(chunks)
关闭连接

当连接不再需要时可以使用close关闭socket连接,关闭后的连接不能再进行任何操作。当一个socket被回收时会自动关闭,但是不要依赖这种机制,不需要socket时就主动的close。

服务端

服务端程序执行的步骤:
1. 创建服务端socket
1. 将服务端socket绑定到指定的地址和端口
1. 监听连接
1. 接受客户端连接
1. 处理客户端的数据
1. 关闭客户端连接

一个简单的echo server示例:

Pythonimport socket

HOST = ""
PORT = 10022

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
conn, addr = s.accept()
while True:
    data = conn.recv(1024)
    if not data:
        break
    conn.sendall(data)
conn.close()

客户端程序:

Pythonimport socket

HOST = "localhost"
PORT = 10022

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b"hello socket")
data = s.recv(1024)
print("Received", repr(data))
s.close()
错误处理

socket处理过程中发生错误会抛出异常,socket相关的异常有:
- socket.error
- socket.herror
- socket.gaierror
- socket.timeout

Pythonimport socket

HOST = None
PORT = 10022

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(10)
except: socket.error as msg:
    print(msg)
参考资料

Socket Programming HOWTO

Porting Python 2 Code to Python 3

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37491.html

相关文章

  • Python-Socket-Programming(1)

    摘要: Abstract Sockets are used nearly everywhere, but are one of the most severely misunderstood technologies around. This is a 10,000 foot overview of sockets. It’s not really a tutorial - you’ll s...

    animabear 评论0 收藏0
  • Python 编程速成

    摘要:同时无论在哪种平台上,都可以用进行系统编程。这样导入模块并使用生成随机数中的模块提供了生成随机数的函数。生成的随机数介于和之间。可以从自己定义的范围中生成一个随机数,如下所示操作日期和时间你可以从日期中提取所需的值,如下所示。 翻译:疯狂的技术宅https://likegeeks.com/python-... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 ...

    187J3X1 评论0 收藏0
  • Socket 编程实战

    摘要:本文原发于个人博客在英文中的含义为连接两个物品的凹槽,像,意为眼窝,此外还有插座的意思。协议,所是用的传输协议,目前有三种。,也称为无连接的,使用协议。当函数返回时,意味着对端已经关闭。 本文原发于个人博客 Socket 在英文中的含义为(连接两个物品的)凹槽,像the eye socket,意为眼窝,此外还有插座的意思。在计算机科学中,socket 通常是指一个连接的两个端点,这里的...

    TNFE 评论0 收藏0
  • [译]Python 中的 Socket 编程(指南)

    摘要:当一个客户端连接时,它将返回一个新的对象,对象中有表示当前连接的和一个由主机端口号组成的连接的元组,更多关于元组值的内容可以查看地址族一节中的详情这里必须要明白我们通过调用方法拥有了一个新的对象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 说明 本书翻译自 realpython 网站上的文章教程 ...

    sushi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<