美文网首页
Python网络编程

Python网络编程

作者: 某言 | 来源:发表于2018-07-11 14:25 被阅读0次

    网络编程很常用,很底层,实际上,http协议,也是建立在网络编程上的,只是说这一层,由nginx或者是apache实现了。在工作当中,在网关设备之间传输数据的时候,就用到了网络编程,刚开始写的程序部署服务器后很不稳定,客户端异常或者是断开连接,服务端就会断开,或者是阻塞,不能再接受到客户端的信息,或者是处理多个客户端连接时候没有好的方案,出了不少问题,现在总结下这些问题。

    服务端

    #只要一个客户端连上,就能一直接受客户端的消息,是一个长连接
    import socket
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    config = ("0.0.0.0",6002)
    server.bind(config)
    server.listen(5)
    # 阻塞,等待(监听)连接,等有客户端连接之后才会往下执行
    con,addr = server.accept()
    while True:
        print("Client has link the server...")
        try:
            #阻塞,等待(监听)接受数据,收到数据之后才会往下执行
            msg = con.recv(1024)
            print(msg)
            con.send(b"this is from tcp_server")
        except Exception as e:
            #如果客户端断开,那么,报错,打破while的循环,否则一直while
            print("has stop")
            con.close()
            break
    

    客户端

    # 给tcp服务器发送5次消息
    import socket
    import time
    count = 0
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    config = ("192.168.101.67",6002)
    client.connect(config)
    while count < 5:
        client.send(b"this is from client")
        #到recv()阻塞,等待接受数据,接收到之后接续执行
        print(client.recv(1024))
        count+=1
        time.sleep(1)
    

    服务端多线程,一个tcp服务不可能仅仅只解决一个客户端的请求,如果按照上面的代码,那么,若两个客户端同时连接了,那么,只有在A客户端的连接关闭之后,另一个客户端B的阻塞才能终止,也才能和B客户端通信。如果才能够多个客户端连上tcp server后,都互不影响,各自做各自的工作呢——这就想到了多线程了。

    import socket
    import os
    import threading
    
    #得到socket
    class get_server_socket():
        def __init__(self,ip,port):
            self.port = port
            self.ip = ip
        def get_socket(self):
            server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            config = (self.ip,self.port)
            server_socket.bind(config)
            server_socket.listen(10)
            print("Waiting for client connect...")
            return server_socket
    #多线程监听客户端连接
    class get_msg(threading.Thread):
        def __init__(self,socket,num):
            super(get_msg,self).__init__()
            self.socket = socket
            self.num = num
        def spy_client(self):
            # 每一个链接都需要创造一个线程,不然当一个线程连接上时候,其他的会阻塞
            con,addr = self.socket.accept()
            while True:
                recv = con.recv(1024) 
                con.send(b"This is reply from server port")
                print(recv)
                print("Current thread number is {}".format(threading.activeCount()))
        def run(self):
            try:
                self.spy_client()
            except Exception as e:
                #如果客户端主动断开或者那个线程错误,那么,继续延续,防止线程用完
                self.spy_client()
    
    serverSocketInstance = get_server_socket("0.0.0.0",6001)
    serverSocket = serverSocketInstance.get_socket()
    thread_num = 3
     for x in range(0,thread_num):
         tmp = get_msg(serverSocket,x+1) 
         tmp.start()
    

    服务端io复用

    新同事所得工具(twisted)

    相关文章

      网友评论

          本文标题:Python网络编程

          本文链接:https://www.haomeiwen.com/subject/pkkfoxtx.html