Python网络编程

网络编程很常用,很底层,实际上,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网络编程)