Python3.x建立服务器自动监测端口数据,客户端测试服务器

建立Python的服务端

类似于java的tcp协议,Python中的服务端建立方式类似

首先需要导入socket类

import socket
from time import ctime#导入时间类

建立套接字,绑定IP地址和端口,设置最大连接数

创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ipv4的类型。

""" 
@version: v1.0 
@author: jerrygaoling 
@site: ${SITE}  
@file: $test_python_sever.py 
@time: 2018.03.10 
""" 
if __name__=="__main__":
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建套接字   
    sock.bind(('localhost', 8081))  #配置soket,绑定IP地址和端口号  
    sock.listen(1) #设置最大允许连接数,各连接和server的通信遵循FIFO原则
    print ("Server is listenting port 8081, with max connection 1")#给定输出提示性语句。 

循环监听端口

不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
accept()方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。

    while True:  #循环轮询socket状态,等待访问
        connection,address = sock.accept()

注意!!:当为多线程时,需要进行多线程编写,本文只是单线程连接。

        try:    
            connection.settimeout(50)#设置定时时间  
            #获得一个连接,然后开始循环处理这个连接发送的信息  
            while True:
                try:
                    buf = connection.recv(1024).decode()
                    if not buf:
                        break
                    print (buf)  
                    if buf == '1':    
                        print ("send welcome")  
                        connection.send(('[%s] %s' % (ctime(),"welcome,glyz的学习记录")).encode())    
                    elif buf=='2':    
                        connection.send(('[%s] %s' % (ctime(),"我的学习记录!")).encode())   
                        print ("send refuse")  
                    else:   
                        print ("close")  
                        break  #退出连接监听循环
                except socket.error:
                    print ("get connect error,lost_client")#当连接失败时,捕捉异常并退出,继续监听。
                    break
        except socket.timeout:  #如果建立连接后,该连接在设定的时间内无数据发来,则time out  
            print ("time out")  
            print ("closing one connection") #当一个连接监听循环退出后,连接可以关掉  
            connection.close()

注意:在Python3.x以上,使用send()方法进行交互传送数据的时候,不能够直接send(”类似于这样的数据”),需要使用上述代码中的格式,使用encode()方法进行转换。否则会报出a bytes-like object is required, not ‘str’的错误。

需要使用encode()方法将bytes类型转换为str类型。使用recv()方法接收数据时,也同样需要使用decode()来转换。

注:代码以按照严格的Python格式进行排版。可直接使用

附上测试用客户端代码

import socket
import time 
if __name__=="__main__":    

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
    sock.connect(('localhost', 8081)) #设置连接IP地址与端口      
    flag = '1'
    sock.send(flag.encode())
    '''#以下代码为循环访问服务器给出数据请求
    print (type(flag))
    while True:   
        time.sleep(3)    
        print ('send to server with value: '+ flag)   
        sock.send(flag.encode())    
        print (sock.recv(1024).decode())   
        flag = (flag=='1') and '2' or '1' #change to another type of value each time
        '''
    sock.close()

运行结果:

启动服务器
这里写图片描述
打开客户端,循环发送、接收数据:
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值