我学python网络编程的一些小栗子
example 1 — socket
# server version 1.0
import socket
class my_ftp(object):
def __init__(self,addr,port):
self.addr = addr
self.port = port
self.server = socket.socket()
self.start_server() # start the server
def start_server(self): # finish the conf of the server
self.server.bind((self.addr,self.port))
self.server.listen(5)
while True:
print('waiting for connection ... ')
conn,addr = self.server.accept() # return conn ,addr
while True:
try:
conn.send(b'commond of the server')
cmd = conn.recv(1024).decode('utf-8')
# print(type(cmd))
if hasattr(self,cmd):
func = getattr(self,cmd)
func()
else:
print('bad commond ...')
except Exception as e:
print(e)
conn.close()
break
def upload(self):
print('test in upload...')
def download(self):
print('test in download...')
if __name__ == '__main__':
my_ftp('localhost',2333)
# client version 1.0
import socket
class my_client(object):
def __init__(self,addr,port):
self.addr = addr
self.port = port
self.client = socket.socket()
self.conn_to_ftp()
def conn_to_ftp(self):
self.client.connect((self.addr,self.port))
print('connection is OK ...')
print(self.client.recv(1024))
while True:
cmd = input('>>:')
if not cmd:
self.client.close() # exit conn
print('the connection has broken ...')
break
self.client.send(cmd.encode('utf-8'))
if __name__ == '__main__':
my_client('localhost',2333)
example 2 — socketserver
# server version 1.0
import socketserver
class my_handle(socketserver.BaseRequestHandler):
def setup(self):
print('a connection established ...')
def handle(self):
print('test in handle ...')
self.request.send(b'hello client ...')
while True:
try:
cmd = self.request.recv(1024).decode('utf-8')
if hasattr(self,cmd):
func = getattr(self,cmd)
func()
except Exception as e:
print(e)
self.request.close() # not sure has function close
break
def upload(self):
print('test in upload ...')
def download(self):
print('test in download ...')
if __name__ == '__main__':
server_addr = ('localhost',2333)
ftp_server = socketserver.TCPServer(server_addr,my_handle)
ftp_server.serve_forever()
example 3 — socket+thread
# server version 1.0 (use threading)
# support multiple connection ...
import socket
import threading
class my_ftp(object):
def __init__(self,addr,port):
self.addr = addr
self.port = port
self.server = socket.socket()
self.conn_manager()
def conn_manager(self):
self.server.bind((self.addr,self.port))
self.server.listen(5)
while True:
conn,addr = self.server.accept()
print('one conntion established ...')
func = getattr(self,'deal_func')
child_thread = threading.Thread(target=func,args=(conn,addr,))
child_thread.setDaemon(True) # set child thread as Daemon thread
child_thread.start()
def deal_func(self,conn,addr):
while True:
try:
conn.send(b'hello client ... ')
data = conn.recv(1024).decode('utf-8')
if hasattr(self,data):
func = getattr(self,data)
func(conn)
else:
print('bad commond ... ')
conn.send(b'bad commond ...')
except Exception as e:
print(e)
conn.close()
break
def upload(self,conn):
print('test in upload...')
conn.send(b'in upload ...')
def download(self,conn):
print('test in download...')
conn.send(b'in download ...')
if __name__ == '__main__':
my_ftp('localhost',2333)
example 4 —gevent
参考:Python之路,Day9 - 异步IO\数据库\队列\缓存
# server version 1.0 (using gevent)
import gevent
from gevent import monkey,socket
monkey.patch_all() # necessarily
def server(server_addr):
server_sock = socket.socket()
server_sock.bind(server_addr)
server_sock.listen(500)
while True:
conn,addr = server_sock.accept()
gevent.spawn(deal_func,conn)
def deal_func(conn):
try:
while True:
data = conn.recv(1024)
print('from client:',data)
conn.send(data)
if not data:
conn.shutdown(socket.SHUT_WR)
except Exception as e:
print(e)
finally:
conn.close()
if __name__ == '__main__':
server(('0.0.0.0',2333))
example 5 — selectors
参考:Python之路,Day9 - 异步IO\数据库\队列\缓存
# server version 1.0 (use selector)
import selectors
import socket
sel = selectors.DefaultSelector() # use the most efficient way the run the program
def deal_accept(server_sock,mask):
conn,addr = server_sock.accept()
print('establish a connection with ',addr)
sel.register(conn,selectors.EVENT_READ,read)
def read(conn,mask):
data = conn.recv(1024) # Should be ready
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data) # Hope it won't block
else:
print('closing', conn)
sel.unregister(conn)
conn.close()
server_sock = socket.socket()
server_sock.bind(('0.0.0.0',2333))
server_sock.listen()
server_sock.setblocking(False)
sel.register(server_sock,selectors.EVENT_READ,deal_accept)
if __name__ == '__main__':
while True:
events = sel.select()
for key,mask in events:
callback = key.data
callback(key.fileobj,mask)
# client version 1.0
import socket
import sys
messages = [ b'This is the message. ',
b'It will be sent ',
b'in parts.',
]
server_address = ('localhost', 2333)
# Create a TCP/IP socket
socks = [ socket.socket(socket.AF_INET, socket.SOCK_STREAM),
socket.socket(socket.AF_INET, socket.SOCK_STREAM),
]
# Connect the socket to the port where the server is listening
print('connecting to %s port %s' % server_address)
for s in socks:
s.connect(server_address)
for message in messages:
# Send messages on both sockets
for s in socks:
print('%s: sending "%s"' % (s.getsockname(), message) )
s.send(message)
# Read responses on both sockets
for s in socks:
data = s.recv(1024)
print( '%s: received "%s"' % (s.getsockname(), data) )
if not data:
print(sys.stderr, 'closing socket', s.getsockname() )