关注
服务端代码 '''
name: Server End
author: xyxc0673
created_at: 2018-7-26
'''
import socket
import logging
import threading
class TcpServer:
def __init__(self, host, port):
# TCP socket config
self.host = host
self.port = port
self.addr = (self.host, self.port)
# logging config
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
self.logger = logging.getLogger(__name__)
def log(self, message):
self.logger.info(message)
def listen(self, backlog=5):
self.log(f'Server is starting to listen on {self.host}:{self.port}.')
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INET: ipv4, socket.SOCK_STREAM: tcp
self.socket.bind(self.addr)
self.socket.listen(backlog)
self.log(f'Server is listening with the backlog of {backlog}.')
def handler(self, socket, addr):
'''
handle message from connection
'''
host, port = addr
self.log(f'Function handler() for {host}:{port} is on.')
socket.send(b'Weclome to The WORLD.')
while True:
data = socket.recv(1024) # bufsize 1024 means to the max recevied data length
data_decoded = data.decode('utf-8') # recved data is bytes-like.
self.log(f'Received {data_decoded} from {host}:{port}')
# connection closes if message is 'exit'
if data_decoded == "exit":
socket.send(b'exited')
break
socket.sendall(f'Message receved: {data_decoded}'.encode('utf-8'))
socket.close()
self.log(f'Connection from {host}:{port} closed.')
def run(self):
while True:
socket, addr = self.socket.accept()
self.log(f'Client {addr[0]}:{addr[1]} is accepted.')
th = threading.Thread(target=self.handler, args=(socket, addr)) # start a new thread to handle new connection
th.start()
if __name__ == "__main__":
host = '127.0.0.1'
port = 31500
server = TcpServer(host, port)
server.listen()
server.run()
客户端代码 '''
name: Client End
author: xyxc0673
created_at: 2018-7-26
'''
import socket
import logging
import threading
class TcpClient:
def __init__(self, host, port):
# TCP socket config
self.host = host
self.port = port
self.addr = (self.host, self.port)
# logging config
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
self.logger = logging.getLogger(__name__)
def log(self, message):
self.logger.info(message)
def connect(self):
self.log(f'Client is starting to connect to {self.host}:{self.port}.')
# connect to server
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(self.addr)
self.log(f'Client has connected to the server {self.host}:{self.port}.')
# Receive message from server
message = self.socket.recv(1024).decode('utf-8')
self.log(f'Received message {message} from server.')
def run(self):
while True:
user_input = input("Please input: ")
self.socket.sendall(user_input.encode('utf-8'))
data = self.socket.recv(1024)
data_decoded = data.decode('utf-8')
self.log(f'Messge from server: {data_decoded}.')
if data_decoded == "exited":
self.log('Connection has closed.')
break
if __name__ == "__main__":
host = '127.0.0.1'
port = 31500
client = TcpClient(host, port)
client.connect()
client.run()
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
02-24 15:15
哈尔滨工业大学 Web前端 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# xx岗简历求拷打 #
9062次浏览 105人参与
# 求职季如何保持心态不崩 #
212515次浏览 1459人参与
# 开工第一帖 #
30366次浏览 642人参与
# 面试反问你会问什么 #
168672次浏览 1738人参与
# 有转正机会的小厂实习值得去吗? #
8970次浏览 100人参与
# 你听到的“最没用”的秋招建议 #
51389次浏览 324人参与
# 工作不开心辞职是唯一出路吗 #
9650次浏览 40人参与
# 产品面经 #
263495次浏览 2177人参与
# 掌握什么AI技能,会为你的求职大大加分 #
7742次浏览 348人参与
# 你收到了团子的OC了吗 #
1532539次浏览 11825人参与
# 携程求职进展汇总 #
889373次浏览 5882人参与
# 远程面试的尴尬瞬间 #
328484次浏览 1917人参与
# 制造业的秋招小结 #
144854次浏览 2093人参与
# 拼多多求职进展汇总 #
848453次浏览 6593人参与
# 实习要如何选择和准备? #
145219次浏览 1566人参与
# 面试题刺客退退退 #
535408次浏览 7533人参与
# 非技术岗是怎么找实习的 #
295518次浏览 2594人参与
# 找工作时的取与舍 #
122957次浏览 878人参与
# 现在还是0offer,延毕还是备考 #
1299145次浏览 7929人参与
# 你最讨厌面试被问什么 #
8949次浏览 108人参与