服务器端代码:
import socket
import json
import sys
import optparse
import threading
class TCPServer:
def __init__(self,port):
self.port = port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind(('', self.port))
self.server_socket.listen(5)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print("Waiting for connection")
def reliable_send(self, client_socket, data):
json_data = json.dumps(data)
client_socket.send(json_data.encode('utf-8'))
def reliable_recv(self,client_socket):
received_data = ""
while True:
try:
received_data = received_data + client_socket.recv(1024).decode('utf-8')
return json.loads(received_data)
except ValueError:
continue
def client_handler(self,client_socket):
while True:
recv_data = self.reliable_recv(client_socket)
print(recv_data)
if recv_data.strip() == 'q':
break
send_data = input("#~ ")
self.reliable_send(client_socket,send_data)
def run(self):
while True:
client_socket, client_address = self.server_socket.accept()
print("Connected from %s:%d" % (client_address[0], client_address[1]))
t = threading.Thread(target=self.client_handler, args=(client_socket,))
t.start()
def get_params():
parser = optparse.OptionParser('Usage: <Program> -p port')
parser.add_option('-p','--port', dest='port', type='int', help='Specify port')
options, args = parser.parse_args()
if options.port is None:
print(parser.usage)
sys.exit(0)
return options.port
def banner():
banner = """
******************************************************************
******************************************************************
Mulithread TCP Server by Jason Wong V1.0
******************************************************************
******************************************************************
"""
print(banner)
if __name__ == "__main__":
banner()
port = get_params()
tcp_server = TCPServer(port)
tcp_server.run()
客户端代码:
import socket
import json
import sys
import optparse
class UDPClient:
def __init__(self, target, port):
self.target = target
self.port = port
self.client_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Connecting to TCP server: %s %d" % (self.target, self.port))
self.client_s.connect((self.target, self.port))
def reliable_send(self, data):
json_data = json.dumps(data)
self.client_s.send(json_data.encode('utf-8'))
def reliable_recv(self):
received_data = ""
while True:
try:
received_data = received_data + self.client_s.recv(1024).decode('utf-8')
return json.loads(received_data)
except ValueError:
continue
def run(self):
while True:
command = input("$~ ")
self.reliable_send(command)
if command == 'q':
break
print(self.reliable_recv())
self.client_s.close()
def get_params():
parser = optparse.OptionParser('Usage: <Program> -t target -p port')
parser.add_option('-t', '--target', dest='target', type="string", help="Specify IP address of target")
parser.add_option('-p','--port', dest='port', type='int', help='Specify port')
options, args = parser.parse_args()
if options.target is None or options.port is None:
print(parser.usage)
sys.exit(0)
return options.target, options.port
def banner():
banner = """
******************************************************************
******************************************************************
TCP Client by Jason Wong V1.0
******************************************************************
******************************************************************
"""
print(banner)
if __name__ == "__main__":
banner()
target, port = get_params()
udpclient = UDPClient(target, port)
udpclient.run()
STRIVE FOR PROGRESS,NOT FOR PERFECTION