Socket原理与编程基础
•socket简介
socket是进行通讯的一种方式,即调用这个网络库的一些api韩寒苏实现分布在不同主机的相关进程之间的数据交换。
名词定义:
1)IP地址:依照TCP/IP协议分配给本地主机的网络地址,2个进程要通信,任一进程首先要知道通讯对方的位置,即IP地址。
2)端口号:用来辨别本地通讯进程,一个本地的基尼从在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有访问的端口号。
3)连接:两个进程间的通讯链路
•客户/服务端模式
•服务端:其过程是首先服务器放要先开启,并根据请求提供相应的服务。
1)打开一通信通道并告知本地主机,他愿意在某一个公认地址上某端口接收客户请求
2)等待客户请求到到该端口
3)接收到客户端的请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求,新进程处理此客户请求并不需要对其请求做出应答。服务完成后,关闭新进程与客户的通信链路,并终止。
4)返回第2步骤,等待另外一个客户请求
5)关闭服务器
•客户端:
1)打开-通信通道,并连接到服务器所在主机的特定端口
2)向服务器发请求报文,等待并接收应答,继续提出请求
3)请求结束后关闭通道并终止。
•说明:
1)从上面的模式来看,流程会有所不同,因此其代码也会不同
2)服务器进程先启动,主要系统运行,该服务进行就一直存在,知道进程关闭。
•常见API函数
1)socket():创建套接字,-- create a new socket object
2)bind(address):绑定本地地址,必须确保之前没有绑定过。
3)close():
4)accept(self):
accept() -> (socket object, address info) 返回connection、address对,其中connection是新的socket对象,可以在上面发送和接收数据,address是另一端的socket地址
5)connect(address):连接该地址上的远端socket
6)getsockname():getsockname() -> address info 返回socket自己的地址,对查找端口号有用
7)listen(backlog):监听socket连接,参数表示最大连接队列数,通常为5,最小为0
8)recv(bufsize):recv(buflen[, flags]) -- receive data 接收数据,返回表示接收到数据的string。bufsize表示一次接收到的数据最大量
9)send(string):发送数据,返回发送的数据量,程序自己负责检查是否所有的数据已发送并自己处理未发送的数据
10)sendall(string):sendall(data[, flags]) 发送数据,该函数会持续发送数据知道数据发送完毕或出现错误为止。若发送成功返回none。
11)settimeout():
设置阻塞模式下socket的超时时间,其值以秒计算,若给定float,socket的后续操作若在给定超时时间内没有完成,将触发timeout异常。
12)gettimeout():返回超时时间,单位秒或None
13)gethostname():gethostname() -> string 返回当前主机名,--return the current hostname
14)gethostbyname():
gethostbyname(host) -> address 通过主机名获取IP地址,参数为主机名,如:PC-20150412FUUA-- map a hostname to its IP number
15)gethostbyaddr():
gethostbyaddr(host) -> (name, aliaslist, addresslist) 参数为主机名或IP地址 -- map an IP number or hostname to DNS info,如:('PC-20150412FUUA', [], ['fe80::349b:92dc:1bb2:58ca'])
16)getservbyname():
socket.getservbyname('http','tcp') 参数:将服务名和一个协议名,返回的是端口号-- map a service name and a protocol name to a port number