socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件描述符。不同的是文件需要用open()函数打开,而socket用socket()

函数建立.recv()、send()函数和read()、write()函数极为相似。

TCP一般通过accept()来为每个连接的客户端建立一个新的scoket。UDP一般只是使用一个单一的socket,完全依靠recvfrom()返回的值来判断该往哪里发送响应。

 

客户端:

1、建立一个socket:

  1. //SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP,AF_INET表示IPv4
  1. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、连接socket

连接socket需要一个tuple参数,来提供IP和端口号:

  1. s.connect((“www.example.com”, 80))

3、

复制代码
  1. #!/usr/bin/env python
  2.  
  3. import socket
  4.  
  5. print "Creating socket...",
  6. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. print "done."
  8.  
  9. print "Looking up port number...",
  10. port = socket.getservbyname(\'http\', \'tcp\')
  11. print "done."
  12.  
  13. print "Connecting to remote host on port %d..." % port,
  14. s.connect(("www.google.com", port))
  15. print "done."
  16.  
  17. #获取本身的IP和端口号
  18. print "Connected from", s.getsockname()
  19. #获取远程的IP和端口号
  20. print "Connected to", s.getpeername()
复制代码

 

文件类对象:

复制代码
  1. import socket, sys
  2.  
  3. port = 70
  4. host = sys.argv[1]
  5. filename = sys.argv[2]
  6.  
  7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. s.connect((host, port))
  9. fd = s.makefile(\'rw\', 0)
  10.  
  11. fd.write(filename + "\r\n")
  12.  
  13. for line in fd.readlines():
  14. sys.stdout.write(line)
复制代码

高级接口:

复制代码
  1. import urllib, sys
  2.  
  3. f = urllib.urlopen(sys.argv[1])
  4. while 1:
  5. buf = f.read(2048)
  6. if not len(buf):
  7. break
  8. sys.stdout.write(buf)
复制代码

 

 

服务器端:

1、建立一个连接:

  1. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、设置socket选项:

  1. //socket 端口可立即复用
  2. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

3、绑定socket:

  1. s.bind((host, port))

4、监听:

  1. s.listen(1)

5、接受连接:

  1. while 1:
  2. clientsock, clientaddr = s.accept()
  3. print "Got connection from", clientsock.getpeername()
  4. clientsock.close()

6、

复制代码
  1. #!/usr/bin/env python
  2.  
  3. import socket, traceback
  4.  
  5. host = \'\' # Bind to all interfaces
  6. port = 51423
  7.  
  8. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  9. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  10. s.bind((host, port))
    #这里设定每次最多只有一个等候处理的请求,真正的服务器会设置一个很高的数字。
  11. s.listen(1)
  12.  
  13. while 1:
  14. try:
  15. clientsock, clientaddr = s.accept()
  16. except KeyboardInterrupt:
  17. raise
  18. except:
  19. traceback.print_exc()
  20. continue
  21.  
  22. # Process the connection
  23.  
  24. try:
  25. print "Got connection from", clientsock.getpeername()
  26. # Process the request here
  27. except (KeyboardInterrupt, SystemExit):
  28. raise
  29. except:
  30. traceback.print_exc()
  31.  
  32. # Close the connection
  33.  
  34. try:
  35. clientsock.close()
  36. except KeyboardInterrupt:
  37. raise
  38. except:
  39. traceback.print_exc()
复制代码

使用UDP:

复制代码
  1. #!/usr/bin/env python
  2.  
  3. import socket, traceback
  4.  
  5. host = \'\' # Bind to all interfaces
  6. port = 51423
  7.  
  8. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  9. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  10. s.bind((host, port))
  11.  
  12. while 1:
  13. try:
  14. message, address = s.recvfrom(8192)
  15. print "Got data from", address
  16. # Echo it back
  17. s.sendto(message, address)
  18. except (KeyboardInterrupt, SystemExit):
  19. raise
  20. except:
  21. traceback.print_exc()
复制代码

版权声明:本文为L-H-R-X-hehe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/L-H-R-X-hehe/p/3812630.html