python socket 实例 select 流程

JzSocketServer.py

#!/usr/bin/env python
#coding:utf-8

"""
FuncName: JzSocketServer.py
Desc: study socket for python 2.7
Date: 2017-01-16 10:30
Author: johnny
"""

from socket import socket
from _socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR, TCP_NODELAY, IPPROTO_TCP
import threading
from select import select

class JzSocktServer(object):
    def __init__(self,SERVER_IP,SERVER_PORT):
        self.EVENT_PC = "0"
        self.EVENT_NOTEBOOK = "1"
        self.EVENT_PHONE = "2"
        self.EVENT_TV = "3"
        self.SERVER_IP = SERVER_IP
        self.SERVER_PORT = SERVER_PORT
        self.output_list = []
        self.error_list = []

    def Server(self):
        # simulate report server
        server = socket(AF_INET, SOCK_STREAM)
        server.setblocking(False)    # 设置为非阻塞
        server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        server.bind((self.SERVER_IP, self.SERVER_PORT))
        server.listen(5)
        input_list = [server]   # 初始化将服务端加入监听列表
        while True:
            # 开始 select 监听,对input_list 中的服务端server进行监听
            winput, woutput, werror = select(input_list, self.output_list, self.error_list, 1)
            # 循环判断是否有客户端连接进来,当有客户端连接进来时select将触发
            for recv in winput:
                # 判断当前触发的是不是服务端对象, 当触发的对象是服务端对象时,说明有新客户端连接进来了
                if recv is server:
                    # 接收客户端的连接, 获取客户端对象和客户端地址信息
                    connection, clientAddress = server.accept()
                    print "\033[1;34mGet connection from \033[0m","\033[1;35m%s:%s\033[0m"%(list(clientAddress)[0],list(clientAddress)[1])
                    connection.setblocking(False)
                    connection.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
                    # 将客户端对象也加入到监听的列表中, 当客户端发送消息时 select 将触发
                    input_list.append(connection)

                else:
                    # 由于客户端连接进来时服务端接收客户端连接请求,将客户端加入到了监听列表中(input_list),客户端发送消息将触发
                    # 所以判断是否是客户端对象触发
                    data = recv.recv(1024)  # 接受数据
                    # 客户端未断开
                    if data:
                        if data == self.EVENT_PC:
                            print "\033[1;32mCurrent device is PC"
                        elif data == self.EVENT_NOTEBOOK:
                            print "Current device is NOTEBOOK"
                        elif data == self.EVENT_TV:
                            print "Current device is TV"
                        elif data ==self.EVENT_PHONE:
                            print "Current device is PHONE\033[0m"
                    else:
                        input_list.remove(recv)
                        recv.close()

if __name__ == '__main__':
    SERVER_IP = "192.168.1.8"
    SERVER_PORT = 8085
    event_nested = JzSocktServer(SERVER_IP,SERVER_PORT)
    event_nested.Server()
    """
    threads = []
    t1 = threading.Thread(target=event_nested.Server)
    threads.append(t1)
    t2 = threading.Thread(target=event_nested.Client)
    threads.append(t2)
    for t in threads:
        time.sleep(2)
        t.start()
    """

JzSocketClient.py

#!/usr/bin/env python
#coding:utf-8

"""
FuncName: JzSocketClient.py
Desc: study socket for python 2.7
Date: 2017-01-16 10:30
Author: johnny
"""

from socket import socket
from _socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, IPPROTO_TCP
import threading,time,string
from select import select

class JzSocktClient(object):
    def __init__(self,SERVER_IP,SERVER_PORT):
        self.EVENT_PC = 0
        self.EVENT_NOTEBOOK = 1
        self.EVENT_PHONE = 2
        self.EVENT_TV = 3
        self.SERVER_IP = SERVER_IP
        self.SERVER_PORT = SERVER_PORT
        self.output_list = []
        self.error_list = []

    def Client(self):
        # wait report server connected
        self.client = socket(AF_INET, SOCK_STREAM)
        self.client.connect((self.SERVER_IP, self.SERVER_PORT))
        list = [self.EVENT_PC, self.EVENT_NOTEBOOK, self.EVENT_TV, self.EVENT_PHONE]
        for cmd in list:
            self.client.send(str(cmd))
            time.sleep(1)
        self.client.close()

if __name__ == '__main__':
    SERVER_IP = "192.168.1.8"
    SERVER_PORT = 8085
    event_nested = JzSocktClient(SERVER_IP,SERVER_PORT)
    event_nested.Client()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值