版本:python2.7.11
开发工具:Spyder
原理
本文设计TCP连接(面向连接的可靠传输协议):
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
应用
套接字,两端点程序间的信息通道。
源IP地址和目的IP地址、源端口号和目的端口号的组合称为套接字。
- 客户机端:
- 创建套接字(socket)
- 连接套接字(connect)
- 关闭套接字(close)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM,0)
s.connect(('www.google.com', 80))
s.close()
error: [Errno 10060]
ping www.google.com,无法ping通,将代码改为www.baidu.com,可以运行。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 8001))
import time
time.sleep(2)
while True:
data=raw_input("input command:");
sock.send(data)
print sock.recv(1024)
if data=="3":
break
sock.close()
服务器端:
- 创建套接字(socket)
- 绑定地址(bind)
- 设置为监听状态(listen)
- 接受客户端连接(accept)
- 关闭连接(close)
accept会返回一个套接字,服务端会利用这个套接字与客户端进行联系。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#初始化socket
sock.bind(("127.0.0.1", 8001))#绑定本机地址,8001端口
sock.listen(5)#等待客户连接,系统有5个空位可以放未决请求
while True:
print "waiting client connection..."
connection,address = sock.accept()#接收客户连接请求
print "a client have connected..."
while True:
try:
connection.settimeout(5) #设置超时时间
buf = connection.recv(1024) #接收数据
if buf == "1":
connection.send("you have send me 1!welcome to server!")
elif buf=="2":
connection.send("you have send me 2!I have recv!")
elif buf=="3":
connection.send("close the connection!")
break
else:
connection.send("unknow command!")
except socket.timeout:
print "time out"
connection.close()
print "a client exit..."
accept方法会阻塞,直到客户端被连接。
recv用于接收数据,当协议把数据接收完毕,recv函数就把sock的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)
将客户端第二个代码与服务器端代码同时打开运行。
源代码下载地址:http://download.csdn.net/detail/u012192235/9554285