Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象。套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。

1、socket()模块函数

要创建套接字,必须使用 socket.socket()函数,它一般的语法如下。

socket(socket_family, socket_type, protocol=0)

其中,socket_family 是 AF_UNIX 或 AF_INET(如前所述),socket_type 是SOCK_STREAM或 SOCK_DGRAM(也如前所述)。protocol 通常省略,默认为 0。

所以,为了创建 TCP/IP 套接字,可以用下面的方式调用 socket.socket()。

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

同样,为了创建 UDP/IP 套接字,需要执行以下语句。

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

因为有很多 socket 模块属性,所以此时使用“from module import *”这种导入方式可以接受,不过这只是其中的一个例外。如果使用“from socket import *”,那么我们就把 socket属性引入到了命名空间中。虽然这看起来有些麻烦,但是通过这种方式将能够大大缩短代码,正如下面所示。

tcpSock = socket(AF_INET, SOCK_STREAM)

一旦有了一个套接字对象,那么使用套接字对象的方法将可以进行进一步的交互。

2、套接字对象(内置)方法

常见的套接字对象方法和属性

名称 描述
服务器套接字方法
s.bind() 将地址(主机名、端口号对)绑定到套接字上
s.listen() 设置并启动TCP监听器
s.accept() 被动接受TCP客户端连接,一直等待指导连接到达(阻塞)
客户端套接字方法
s.connect() 主动发起TCP服务器连接
s.connect_ex() connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常
普通的套接字方法
s.recv() 接收 TCP 消息
s.recv_into() 接收 TCP 消息到指定的缓冲区
s.send() 发送 TCP 消息
s.sendall()  完整地发送 TCP 消息
s.recvfrom()  接收 UDP 消息
s.recvfrom_into() 接收 UDP 消息到指定的缓冲区
s.sendto() 发送 UDP 消息
s.shutdown()  关闭连接
s.close()  关闭套接字

3、几个实例。

目前很多教材都是用的Python2.7版本,TCP和UDP部分都有点小问题。

自己分别用TCP和UDP写了时间戳的程序,用的是Python3.6版本。

TCP-Server:

 # -*- coding: utf-8 -*-
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM)#创建服务器套接字
tcpSerSock.bind(ADDR)#套接字与地址绑定
tcpSerSock.listen(5)#监听连接 while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()#接受客户端连接
print('...connected from:', addr) while True:
data = tcpCliSock.recv(BUFSIZ)#接收
if not data:
break
tcpCliSock.send(('[%s] %s' % (ctime(), data.decode())).encode())
#发送
tcpCliSock.close()
tcpSerSock.close()

TCP-Client:

 # -*- coding: utf-8
from socket import * HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR) while True:
data = input('> ')
if not data:
break
tcpCliSock.send(data.encode())#用encode转换成bytes
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))#用decode转换成str tcpCliSock.close()

UDP-Server:

 # -*- coding: utf-8 -*-
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR) while True:
print('waiting for message...')
data, addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto(('[%s] %s' % (ctime(), data.decode())).encode(), addr)
print('...received from and returned to:', addr) udpSerSock.close()

UDP-Client:

 # -*- coding: utf-8 -*-
from socket import * HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True:
data = input('> ')
if not data:
break
udpCliSock.sendto(data.encode(), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print(data.decode()) udpCliSock.close()

最新文章

  1. [Asp.net 5] Caching-缓存架构与源码分析
  2. AlloyTouch插件
  3. bootstrap-markdown编辑器引入
  4. newtonsoft.json 序列化,反序列化
  5. http://www.cnblogs.com/zhaoguihua/tag/%E9%AB%98%E6%80%A7%E8%83%BD%E7%BD%91%E7%AB%99/
  6. Hbuild - 使用海马玩模拟器调试
  7. 使用CodeDOM实现代码生成及动态编译
  8. js回调函数(callback)理解
  9. c#代码画图
  10. POJ 2287 Tian Ji -- The Horse Racing(贪心)
  11. Keywords Search - HDU 2222(AC自动机模板)
  12. 用CSS3写的钟表
  13. 【POJ 1125】Stockbroker Grapevine
  14. jQuery实例1
  15. 阿里云服务器Centos 7安装PHP
  16. Java集合详解8:Java集合类细节精讲
  17. vue webpack build时关闭debug和console
  18. C# Html格式内容转Csv内容包括table(重点在rowspan和colspan合并),p,div元素
  19. C++中全排列算法函数next_permutation的使用方法
  20. PROFIBUS-DP现场总线的结构及应用

热门文章

  1. js测试
  2. ext异常,ExceptionReturn
  3. Vmware虚拟机修改静态IP无法ping外网,以及eth0不见问题解决
  4. CentOS安装python setuptools and pip
  5. nginx 403 forbidden 二种原因
  6. petrozavodsk summer 2018 游记&&总结
  7. 【vijos】1763 Wormhole(贪心)
  8. jQuery特效:图片的轮播
  9. nginx https配置+nginx跳转到万网虚拟主机
  10. SDN开发过程中遇到的一些问题总结