socket是操作系統中I/O的延續,它可以使進程和機器之間的通信成為可能。socket可以看成一個標准的文件描述符。不同的是文件需要用open()函數打開,而socket用socket()
函數建立.recv()、send()函數和read()、write()函數極為相似。
TCP一般通過accept()來為每個連接的客戶端建立一個新的scoket。UDP一般只是使用一個單一的socket,完全依靠recvfrom()返回的值來判斷該往哪里發送響應。
客戶端:
1、建立一個socket:
//SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP,AF_INET表示IPv4
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2、連接socket
連接socket需要一個tuple參數,來提供IP和端口號:
s.connect((“www.example.com”, 80))
3、
#!/usr/bin/env python import socket print "Creating socket...", s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print "done." print "Looking up port number...", port = socket.getservbyname('http', 'tcp') print "done." print "Connecting to remote host on port %d..." % port, s.connect(("www.google.com", port)) print "done." #獲取本身的IP和端口號 print "Connected from", s.getsockname() #獲取遠程的IP和端口號 print "Connected to", s.getpeername()
文件類對象:
import socket, sys port = 70 host = sys.argv[1] filename = sys.argv[2] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) fd = s.makefile('rw', 0) fd.write(filename + "\r\n") for line in fd.readlines(): sys.stdout.write(line)
高級接口:
import urllib, sys f = urllib.urlopen(sys.argv[1]) while 1: buf = f.read(2048) if not len(buf): break sys.stdout.write(buf)
服務器端:
1、建立一個連接:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2、設置socket選項:
//socket 端口可立即復用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
3、綁定socket:
s.bind((host, port))
4、監聽:
s.listen(1)
5、接受連接:
while 1: clientsock, clientaddr = s.accept() print "Got connection from", clientsock.getpeername() clientsock.close()
6、
#!/usr/bin/env python import socket, traceback host = '' # Bind to all interfaces port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port))
#這里設定每次最多只有一個等候處理的請求,真正的服務器會設置一個很高的數字。 s.listen(1) while 1: try: clientsock, clientaddr = s.accept() except KeyboardInterrupt: raise except: traceback.print_exc() continue # Process the connection try: print "Got connection from", clientsock.getpeername() # Process the request here except (KeyboardInterrupt, SystemExit): raise except: traceback.print_exc() # Close the connection try: clientsock.close() except KeyboardInterrupt: raise except: traceback.print_exc()
使用UDP:
#!/usr/bin/env python import socket, traceback host = '' # Bind to all interfaces port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) while 1: try: message, address = s.recvfrom(8192) print "Got data from", address # Echo it back s.sendto(message, address) except (KeyboardInterrupt, SystemExit): raise except: traceback.print_exc()