本博客转载自
socket网络编程接口
- 基本概念
可以这样来理解socket,完成一段网络通信需要五个元素,协议族,协议类型,协议,目标ip地址,目标端口号,这是由TCP/IP网络结构决定的。socket作为一种数据结构,将以上五个信息组合起来,称为套接字。根据面向连接与非连接,套接字类型分为Datagram与Stream两种类型。Datagram套接字使用UDP协议,向目标地址发送数据包,不保证可靠送达,Stream使用TCP协议,是可靠的、具有差错与流量控制的传输协议,也就是说,stream类型的套接字传输信息,具有较好的可靠性,而Datagram类型的套接字具有更高的实时性。 - 初始化流式套接字的步骤
- 服务端
- 使用socket函数创建套接字
- 绑定到指定的ip地址
- 监听客户端连接
- 获取客户端连接后,使用返回的套接字收发数据
- 通信结束,关闭套接字
- 客户端
- 创建套接字
- 连接指定ip地址
- 连接成功后收发数据
- 关闭套接字
-
常用套接字函数
- 例程
- 时间戳服务器
#!/usr/bin/env python import socket from time import ctime host='127.0.0.1' port=8000 bufsize=1024 addr=(host, port) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(addr) sock.listen(5) while True: print 'waiting for connection...' clisock, cliaddr = sock.accept() print 'connected from', cliaddr print 'peername:', clisock.getpeername() data = clisock.recv(bufsize) if not data: break clisock.send('[%s] %s' % (ctime(), data)) clisock.close() sock.close()
- 客户端
#!/usr/bin/env python from time import ctime import socket host='127.0.0.1' port=8000 addr=(host, port) bufsize=1024 while True: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(addr) data = raw_input(u'>') if not data: break sock.send(data) data = sock.recv(bufsize) print data #!/usr/bin/env python from time import ctime import socket host='127.0.0.1' port=8000 addr=(host, port) bufsize=1024 while True: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(addr) data = raw_input(u'>') if not data: break sock.send(data) data = sock.recv(bufsize) print data sock.close() sock.close()
- 时间戳服务器
- 服务端