Python服務器開發三:Socket


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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM