python socket 常见方法及 简单服务/客户端

socket 常见方法:

补充说明:what is file descriptor? 文件描述符是什么?

参考(http://stackoverflow.com/questions/8191905/whats-is-difference-between-file-descriptor-and-file-pointer)

File pointer:

  1. It is high level interface
  2. Passed to fread() and fwrite() functions
  3. Includes buffering,error indication and EOF detection,etc.
  4. Provides higher portability and efficiency.

File descriptor:

  1. Low/Kernel level handler
  2. passe to read() and write() of UNIX System Calls
  3. Doesn't include buffering and such features
  4. Less portable and lacks efficiency

socket.accept() ,接受一个连接,但前提是socket必须已经绑定了一个地址,在等待连接。返回值是一个(conn, addresss)的值对,这里的conn是一个socket对象,可以用来改送或接收数据.而address是连接另一端绑定的地址,socket.getpeername()函数也能返回该地址。

socket.bind(address),将socket对象绑定到一个地址,但这个地址必须是没有被占用的,否则会连接失败。这里的address一般是一个ip,port对,如(‘localhost’, 10000)

socket.close(),关闭连接,当socket.close()执行时,与这个连接相关的底层操作也会关闭(如文件描述符),一旦关闭,再对相关的文件对象操作都会失败。

socket.connect(address),连接到一个address对应的远程socket。如果连接被中断,这个方法会等待直到连接完成,或者会抛出socket.timeout错误(超时)

socket.connect_ex(address), 类似与connect(address),但是当遇到c语言层的异常时,并不会抛出异常,而是返回一个错误指示器。但其他异常如host not found还是会抛出异常,操作成功时,错误指示器的值是0,否则是不确定的值。

如:

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect_ex(('localhost', 1024))
111

socket.detach(),将socket 对象设置为关闭状态,但底层的文件描述符并没关闭,仍可以进行操作,返回值为文件描述符。

socket.dup(), 复制一个socket

socket.fileno(),返回文件描述符(一个很小的整数),如果失败返回-1.win系统上,返回的个整数不能用在如os.fdopen()方法。

socket.get_inheritable(),测试socket是否可以继承,True或者False

socket.getpeername() , 返回当前socket连接的远程地址

socket.getsockname(), 返回socket自己的地址,如:

>>> s.bind(('localhost', 10000))
>>> s.getsockname()
('127.0.0.1', 10000)

socket.gettimeout(), 返回超时值,单位是秒,没有设置返回None.

>>> s.gettimeout()
>>> print(s.gettimeout())
None
>>> 

socket.listen([backlog]), 监听,使得服务器能接收服务端连接,如果backlog指定了(最少是0,如果比0小,系统默认改成0),限制可以连接的数量,如果没有指定,将指派一个默认的合理值。

socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None,newline=None), 返回一个文件对象,具体类型与参数相关,除了只能指定‘r’,‘w’,'b'模式外,与open()函数一样.

前提条件是socket必须是阻塞模式,它可以含有一个超时间(指socket),如果发生超时,内部缓冲区会在不一致的状态中关闭。

关闭文件对象不会关闭socket,除非调用了socket.close()方法,或者所有其他文件对象都关闭了。

注意:在win上,makefile创建的一个类文件对象在需要文件描述符的文件对象的情况下是无法使用的(意思大概是makefile创建的文件对象没有文件描述符)

socket.recv(bufsize[, flags]),从socket接收数据,注意是byte类型,bufsize指定一次最多接收的数据大小,

 

socket.recvfrom(bufsize[, flags]) ,与上一个方法的区别是返回值除了数据还有发送数据的地址,返回值是一个数据,地址对(data, address)

socket.recvmsg(bufsize[, ancbufsize[, flags]]), 接收常规文件,附件等。ancbufsize设定附件接收缓冲区,类似于bufsize。但返回值是有四个元素的元组()。(data, ancdata, msg_flags, address). ancdata是一个含有四个0的列表或者是(cmsg_level, cmsg_type, cmsg_data)这样的列表。

socket.send(bytes[,flags]), 发送数据到socket,前提是已经连接到远程socket,返回值是发送数据的量,检查数据是否发送完是应用的责任

socket.sendall(bytes[,flags]), 同上,与send不同的是,它会一直发送完为止,或者发生了错误,导致异常。发送成功返回None

socket.sendto(bytes, flags, address), 基本与socket.send()相同

socket.sendmsg()对应上面的socket.recvmsg()

 待续。。。

原文地址:https://www.cnblogs.com/Andy963/p/5738399.html