[关闭]
@nemos 2017-05-05T15:12:30.000000Z 字数 1128 阅读 836

socket

py


socket为操作系统提供的工作于应用层与传输层之间的api。
如http之列的协议就由socket搭建。
socket由地址(ip+端口),协议(tcp,udp)唯一标识。

TCP

TCP


tcp状态机
TCP状态图


sever

  1. #
  2. # server.py
  3. #
  4. import socket
  5. tcp_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 返回套接字对象
  6. try:
  7. tcp_s.bind((HOST, PORT))
  8. except OSError as err:
  9. print(str(err))
  10. tcp_s.listen(5) # 开始监听,参数为等待请求的个数,大于这个个数请求会被拒绝
  11. while True:
  12. cli_sock, address = tcp_s.accept() # 接受连接
  13. # address为(HOST, PORT)
  14. data = cli_sock.recv(1024) # 接收数据,参数为缓冲区大小
  15. if not data:
  16. break
  17. reply = 'ok...' + data
  18. cli_sock.sendall(reply)
  19. cli_sock.close() # 关闭连接
  20. tcp_s.close()
  21. #
  22. # clientr.py
  23. #
  24. tcp_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  25. tcp_s.connect((HOST, PORT))
  26. tcp_s.send(data)
  27. print(tcp_s.recv(1024))

UDP

server

  1. #
  2. # server.py
  3. #
  4. import socket
  5. udp_s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. udp_s.bind((HOST, PORT))
  7. while True:
  8. data, addr = udp_s.recvfrom(1024)
  9. udp_s.sendto(data, addr)
  10. #
  11. # clientr.py
  12. #
  13. udp_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  14. try:
  15. sent = udp_s.sendto(data, (HOST, PORT))
  16. data, server = udp_s.recvfrom(1024)
  17. finally:
  18. udp_s.close()

细节

  1. socket.gethostbyname(url) # 获得远程主机的ip地址

family(地址簇)

参数 说明
AF_UNIX 用与单一机器下的进程通信。
AF_INET 用与服务器之间相互通信,通常都用这个。
AF_INET6 支持IPv6

sockettype (socket类型)

参数 说明
SOCK_STREAM 用于TCP协议
SOCK_DGRAM 用于UDP协议

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注