本文主要是使用socket模块。
模块函数socket()
要创建套接字,必须使用 socket.socket()
函数。该函数的语法如下:
socket.socket(socket_family, socket_type, protocol=0)
其中socket_family 是地址簇,可为以下值:
- AF_UNIX
- AF_INET(IPv4)
socket_type 为类型,可为以下值:
- SOCK_STREAM (使用 TCP 传输控制协议)
- SOCK_DGRAM(使用 UDP 传输控制协议)
创建TCP实例代码如下:
from socket import *
tcpSerSock = socket(AF_INET, SOCK_STREAM)
创建失败会抛出socket.error异常,这里需要进行捕获。
from socket import *
import sys
try:
tcpSerSock = socket(AF_INET, SOCK_STREAM)
print "Created"
except error as err:
print err
sys.exit()
内置方法(常用)
名称 | 描述 |
---|---|
服务器套接字方法 | |
s.bind() | 将地址(主机、端口对)绑定到套接字 |
s.listen() | 设置并启动TCP监听 |
s.accept() | 被动接受TCP客户端连接,一直等待,直到连接到达(阻塞) |
客户端套接字方法 | |
s.connect() | 主动发起TCP服务器连接 |
公共用途的套接字方法 | |
s.resv() | 接受TCP消息 |
s.send() | 发送TCP消息 |
s.close() | 关闭套接字 |
s.getsockname() | 当前套接字的地址 |
创建一个TCP服务器(这里是简单的单线程)
TCP服务器会等待请求,一旦接收到一个连接,accept()
函数就会返回一个单独的客户端套接字用户后续的通讯。当客户端关闭连接后,服务器继续等待下一个客户的连接。
文件 tsTserv.py
创建一个TCP服务器程序,将客户端发来的字符串加上时间戳返回给客户端。
from socket import *
from time import ctime
HOST = '127.0.0.1' # 运行在本机上,这里的HOST填写127.0.0.1或localhost
PORT = 21567 # 端口号
BUFSIZ = 1024 # 数据大小
ADDR = (HOST, PORT)
# 地址簇 : AF_INET (IPv4), 类型: SOCK_STREAM (使用 TCP 传输控制协议)
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))
tcpCliSock.close()
tcpSerSock.close()
创建TCP客户端
客户端文件 tsTclnt.py
提示用户输入要传给服务器的信息,然后显示服务器返回的数据。
from socket import *
HOST = '127.0.0.1' # 在本机运行就要和tsTserv.py中相同,在其他机器运行,就要填写服务器所在的ip
PORT = 21567 # 端口号必须和以上保持一致
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input(">")
if not data: # 用户无输入,则关闭客户端
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print data
tcpCliSock.close()
运行客户端和TCP服务器
需要先启动服务器,然后再启动客户端。
这是测试结果: