Binary

to be foolish,to be hungry

有的事拼命的想要忘记,到最后真的就忘了


Download the theme

Python网络编程小栗子

我学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() )
最近的文章

Rabbitmq

RabbitMQRabbitMQ可以实现完全独立的程序之间的通讯。在多进程中我们知道了queue可以用于进程之间的通讯,但是那只限于父进程与子进程,同一个父进程的子进程之间的通信,不能实现完全独立的进程之间的通讯(比如主机A的a进程想和主机B的b进程通讯)。而RabbitMQ作为一个通讯的中间人可以帮我们解决上述问题。1.安装erlang 语言,RabbitMQ为erlang语言开发2.安装RabbitMQ3.RabbitMQ的一些小栗子相关模块pika(其实还有几个,我先入个门就暂时先用...…

继续阅读
更早的文章

Python多线程 N部曲(3)

第三曲多进程库名multiprocessing简单例子# 使用方法和多线程类似from multiprocessing import Processimport osimport timedef P_func(name): print(name,os.getpid()) # 打印进程的 ID time.sleep(2)p_list = []if __name__ == '__main__': for i in range(10): p = Proces...…

继续阅读