最基础的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)

最基础的Python的socket编程入门教程的更多相关文章

  1. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  2. 国内第一本micropython的书出版《机器人Python极客编程入门与实战》

    第一本micropython的书<机器人Python极客编程入门与实战>. 购买地址:https://item.taobao.com/item.htm?spm=2013.1.w4018-1 ...

  3. python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学

    首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...

  4. 初识Django —Python API接口编程入门

    初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...

  5. Python 3 socket 编程

    Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器 ...

  6. python之socket编程(一)

    socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...

  7. Python可视化界面编程入门

    Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sysfrom PyQt5.QtWidgets import QWidget,QApplicati ...

  8. Python:socket编程教程

    ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...

  9. Python 数据处理库 pandas 入门教程

    Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...

随机推荐

  1. JanusGraph 创建索引步骤(composite index)踩坑总结

    前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...

  2. learning java ProcessHandle 获取进程相当信息

    Process p = rt.exec("notepad.exe"); ProcessHandle ph = p.toHandle(); System.out.println(&q ...

  3. C语言定义结构体指针数组并初始化;里面全是结构体的地址

    #include <stdio.h> #include <string.h> struct tells;//声明结构体 struct info { char *infos; } ...

  4. 洛谷 P2627 修剪草坪 题解

    P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...

  5. beego 前后端分离登录验证

    conf>app.conf 文件添加一下参数 copyrequestbody=true sessionon =true routers>router.go 文件添加初始化路由 func i ...

  6. golang-切片

    切片练习 package main import "fmt" /*func main() { arr := [10]int {1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  7. Python和多线程(multi-threading)。这是个好主意码?列举一些让Python代码以并行方式运行的方法。

    Python并不支持真正意义上的多线程.Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意.Python中有一个被称为Global Interpreter ...

  8. 第02组 Alpha冲刺(2/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 任务分配.进度监督 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 还剩下哪些任务 ...

  9. Zk单机多实例部署

    一.环境准备 当前环境:centos7.3一台软件版本:zookeeper-3.5.2部署目录:/usr/local/zookeeper启动端口:2181,2182,2183配置文件:/usr/loc ...

  10. Samba文件共享服务设置

    SMB的主程序 smbd:SMB-TCP139,CIFS-TCP445 nmbd:NetBios-UDP137,138 SMB主程序对应的两个服务 /etc/init.d/smb /etc/init. ...