首页 > 代码库 > Socket模块学习
Socket模块学习
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
如何使用socket?
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
创建socket对象:
socket.socket(family=AF_INET, type=SOCK_STREAM)
family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和UDP)
type参数可以为SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字)。
Socket对象的主要属性和方法:
socket.bind(address)
address一般情况下为一个双元素元组, ((host,port)) ,主机名或者ip地址+端口号。
socket.listen(backlog)
socket的监听连接数,定义了最大队列,最大值依赖于主系统(一般情况下为5)
socket.accept()
调用accept方法时,socket会进入‘waiting‘(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有俩个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。
socket.connect(address)
连接到address定义的远程socket
socket.send(bytes[, flags])
发送信息到远程socket
socket.recv(bufsize[, flags])
服务器端通过socket获取data信息,bufsize定义了一次性接收的最大值
TCP
Server.py
import sockets = socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind(("",8081))s.listen(1)while True: connection,address = s.accept() data = http://www.mamicode.com/connection.recv(1024)>
Client.py
import socketfrom pip.backwardcompat import raw_inputs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)port = 8081host = "localhost"s.connect((host,port))while True: msg = raw_input() s.send(bytes(msg,‘utf-8‘)) s.close()
UDP
server端代码
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(("",8081))while True: data,host=s.recvfrom(1024) print(‘Received:‘,data,‘from‘,host)
Client端代码
import socketfrom pip.backwardcompat import raw_inputs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)port = 8081host = "localhost"while True: msg = raw_input() print(msg) s.sendto(bytes(msg,encoding = "utf-8"), (host, port))
Socket模块学习