最基础的Python的socket编程入门教程

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

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

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

import socket

登录后复制

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

登录后复制

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

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

s.connect(('localhost', 8000))s.connect(('127.0.0.1', 8000))s.connect(('www.baidu.com', 80))

登录后复制

发送数据

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

立即学习“Python免费学习笔记(深入)”;

def mysend(s, msg):  total_len = len(msg)  total_sent = 0  while total_sent 

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

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

import sockets = socket.socket()s.connect(('www.baidu.com', 80))s.sendall('test')

登录后复制

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

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

登录后复制

Python 2中执行成功。

# 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函数接收数据:

data = s.recv(4096)

登录后复制

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

def myreceive(s, msglen):  chunks = []  bytes_recd = 0  while bytes_recd 

关闭连接

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

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

一个简单的echo server示例:

import socketHOST = ''PORT = 10022s = 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()

登录后复制

客户端程序:

import socketHOST = 'localhost'PORT = 10022s = 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

import socketHOST = NonePORT = 10022try:  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  s.bind((HOST, PORT))  s.listen(10)except: socket.error as msg:  print(msg)

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2295509.html

(0)
上一篇 2025年2月28日 02:59:53
下一篇 2025年2月28日 03:00:11

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论