Skip to content

Instantly share code, notes, and snippets.

@leadscloud
Created December 11, 2014 07:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leadscloud/957fd8c8ff32ae46c3aa to your computer and use it in GitHub Desktop.
Save leadscloud/957fd8c8ff32ae46c3aa to your computer and use it in GitHub Desktop.
代码2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Code is built by Ray. QQ: 75504026 E-mail:zhanglei@shibangcrusher.com
# Development environment: win7 64bit, python 2.7.8
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import datetime
import time
import socket
import threading
import SocketServer
class Server(ThreadingMixIn, TCPServer): pass
# StreamRequestHandler
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
cur_thread = threading.current_thread()
response = "{}: {}".format(cur_thread.name, data)
print 'Connected from ', self.client_address
# self.request.sendall(response)
# 7b01001631383536373737333533320a8a037213897b
print "DTU registering...|", data, "|", repr(data), "|", data.encode("hex")
if data[0:4] == b'\x7b\x01\x00\x16' and data[21] == b'\x7b':
print "send confirm code..."
# 7b81001631383536373737333533320a8a037213897b
# \x7b\x81\x00\x10\x31\x38\x35\x36\x37\x37\x37\x33\x35\x33\x32\x7b
# 7b81001031383536373737333533327b
sent_data = "7b81001031383536373737333533327b".decode("hex")
print repr(sent_data), sent_data.encode("hex")
data_s = b'\x7b\x81\x00\x10\x31\x38\x35\x36\x37\x37\x37\x33\x35\x33\x32\x7b'
# 只要发送的数据是 7b81001031383536373737333533327b 就行,但无论如何这段代码不对
self.request.sendall(sent_data)
# self.request.sendto(sent_data, self.client_address)
class Handler(StreamRequestHandler):
def handle(self):
addr = self.request.getpeername()
print 'Got connection from ', addr
print '', self.client_address
self.data = self.request.recv(1024).strip()
print "recv self.data:", self.data, repr(self.data)
# process data
if self.data[0:4] == b'\x7b\x01\x00\x16' and self.data[21] == b'\x7b':
print "DTU is registering..."
dtu_identification = self.data[4:15]
m_ip = []
for x in self.data[15:19]:
m_ip.append(str(int(x.encode("hex"), 16)))
m_port = int(self.data[19:21].encode("hex"), 16)
print "DTU Login Num\tIP Address\tPort\tLogin Time"
print "%s\t%s\t%s\t%s" % (dtu_identification,
".".join(m_ip),
m_port,
datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
# DSC send confirm code to DTU
confirm_code = ("%s%s%s" % ('7b810010',
dtu_identification.encode("hex"), '7b'))
print "confirm_code:", confirm_code, confirm_code.decode("hex")
# self.request.sendall(confirm_code)
# 7b81001031383536373737333533327b
self.request.send("7b81001031383536373737333533327b".decode("hex"))
# self.request.close()
# self.request.sendall(confirm_code.decode("hex").strip())
elif self.data[0:2] == b'\x7b\x09':
# Recv buff data...
data_record_length = int(self.data[2:4].encode("hex"), 16)
start_p = 4 + len(dtu_identification)
end_p = start_p+(data_record_length-len(dtu_identification)-5)
data_record = self.data[start_p:end_p]
# print or process data in here
print ">>>DTU Say:", data_record
server = Server(('', 10049), ThreadedTCPRequestHandler)
server.serve_forever()
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
def client(ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
try:
sock.sendall(message)
response = sock.recv(1024)
print "Received: {}".format(response.encode("hex"))
finally:
sock.close()
if __name__ == "__mains__":
# Port 0 means to select an arbitrary unused port
HOST, PORT = "localhost", 0
server = ThreadedTCPServer((HOST, PORT), Handler)
ip, port = server.server_address
# Start a thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
# Exit the server thread when the main thread terminates
server_thread.daemon = True
server_thread.start()
print "Server loop running in thread:", server_thread.name
client(ip, port, "7b01001631383536373737333533320a8a49d513897b".decode("hex"))
# client(ip, port, "Hello World 2")
# client(ip, port, "Hello World 3")
server.shutdown()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment