最基础的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 socket
s = 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不能保证所有的数据都发送完了,它会返回已发送数据的长度,程序要循环发送数据直到所有数据都已发送完毕。    
def 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能够保证所有的数据都已发送完毕,除非发送过程中出现了错误,它实际上也是循环发送数据直到所有数据发送完成。

这里还要讲一个需要特别注意的地方,从一个例子开始吧:
    
import socket
s = 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 < 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示例:    
import 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()

客户端程序:    
import 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
    
import 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)

转载于:https://www.cnblogs.com/amengduo/p/9586259.html

最基础的Python的socket编程入门教程相关推荐

  1. python socket编程_最基础的Python的socket编程入门教程

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

  2. socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)

    socket 编程入门教程(三)TCP原理:5.TCP的三次握手(three-way handshake) 前面3个小节介绍了socket机制对TCP协议三次握手的实现,需要强调的是,与协议独立于实现 ...

  3. socket 编程入门教程(一)TCP server 端:1、建模

    绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分 ...

  4. socket 编程入门教程(四)TCP应用:1、构建echo服务器

    2019独角兽企业重金招聘Python工程师标准>>> 现在,我们用前面所构建的socket类,重新设计第一章中echo的服务器,然后设计客户端程序. echo服务器的工作原理很简单 ...

  5. socket 编程入门教程(一)TCP server端:3、sockaddr与sockaddr_in

    2019独角兽企业重金招聘Python工程师标准>>> 收件人地址 一家化妆品公司将一批新产品的样品,准备发给某学校某个班的女生们免费试用.通常情况下,这件邮包的地址上可以这么写: ...

  6. socket 编程入门教程(五)UDP原理:4、“有连接”的UDP

    2019独角兽企业重金招聘Python工程师标准>>> 虽然UDP是无连接的,但是也可以通过调用connect()将本地的UDP socket FD与一个远程的UDP socket ...

  7. socket 编程入门教程(三)TCP原理:7、TCP连接的关闭

    2019独角兽企业重金招聘Python工程师标准>>> TCP连接一旦建立,服务器端和客户端就成为了对等关系,任何一方都可以发出关闭握手请求,甚至可以同时发出关闭握手请求.TCP的连 ...

  8. socket 编程入门教程(一)TCP server 端:7、接收与发送

    现在,我们通过accept()创建了新的socket,也就是我们类中的数据成员communicationSock,现在,我们就可以通过这个socket进行通讯了. TCP通讯模型 在介绍函数之前,我们 ...

  9. socket 编程入门教程(一)TCP server 端:6、创建“通讯 ”嵌套字

    这里的"通讯"加上了引号,是因为实际上所有的socket都有通讯的功能,只是在我们的例子中,之前那个socket只负责listen,而这个socket负责接受信息并echo回去. ...

  10. socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字

    前面一小节,我们已经写出了TcpServer的构造函数.这个函数的实际作用,就是创建了listen socket(监听嵌套字).这一节,我们来具体分析这个创建的过程. socket和sockaddr的 ...

最新文章

  1. 工业云计算在中国工业领域的发展与应用趋势
  2. 通过属性值从对象数组中获取JavaScript对象[重复]
  3. Hello World With JBoss Modules
  4. Java反序列化json内存溢出_fastJson与一起堆内存溢出'血案'
  5. Git(10)-merge
  6. 这4种分析方法,大牛产品经理都在用
  7. 【C++、Matlab】VS2013 C++读写.mat文件
  8. 第十六章 复杂的抽像类结构
  9. [转]UINavigationController的用法详解
  10. Nginx一个server主机上80、433http、https共存
  11. logstash zip linux安装,centos7.4安装测试logstash6.5.0
  12. My_arduino(4)-------LiquidCrystal_I2C库文件
  13. 在 visual studio 中添加 ILDASM 工具
  14. 基于STM32的物联网语音控制智能家居
  15. xheditor漏洞 php,xheditor默认upload.php畸形文件上传漏洞
  16. 数值分析|二阶三点式Python编程
  17. 真正手把手教你玩转Git
  18. 每日计划(2)——大二
  19. jupyter中怎么把图形在一个单独的窗口显示_【一点小套路】手把手从安装Python到完成第一个数据分析项目...
  20. .exp是什么文件格式

热门文章

  1. 【大数据】Hbase如何批量删除指定数据
  2. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!...
  3. 回溯2--部分全排列
  4. redis 条件查询
  5. TLS总结(上)——我们为啥需要TLS
  6. Windows Phone 7 Tips (8)
  7. Play项目的application.conf的配置
  8. 1命名规则 sentinel_Sentinel 实战-限流篇
  9. python多线程互斥锁_Python中线程互斥锁是什么
  10. python 存储数据到有向无环图寻找路径_Python 随即生成DAG(有向无环图)