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()