关注
服务端代码 '''
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()
查看原帖
点赞 评论
牛客热帖
更多
正在热议
更多
# 什么是优秀的实习经历 #
7987次浏览 205人参与
# 担心入职之后被发现很菜怎么办 #
266040次浏览 1131人参与
# 被上班搭子“传染”了哪些习惯 #
5246次浏览 97人参与
# 投格力的你,拿到offer了吗? #
152216次浏览 813人参与
# 工作后,你落下了哪些病根 #
12888次浏览 182人参与
# 作业帮求职进展汇总 #
82623次浏览 543人参与
# 京东美团大战,你怎么看? #
157913次浏览 859人参与
# 实习简历求拷打 #
10843次浏览 142人参与
# 如果今天是你的last day,你会怎么度过? #
58865次浏览 324人参与
# 秋招被挂春招仍然能投的公司 #
6410次浏览 94人参与
# mt对你说过最有启发的一句话 #
34630次浏览 417人参与
# 为了找工作你花了哪些钱? #
74774次浏览 359人参与
# 机械人晒出你的简历 #
146396次浏览 874人参与
# 嵌入式岗知多少 #
62955次浏览 555人参与
# 摸鱼被leader发现了怎么办 #
100369次浏览 640人参与
# 考研失败就一定是坏事吗? #
200615次浏览 1369人参与
# 秋招特别不鸣谢 #
15273次浏览 175人参与
# 2023毕业生求职有问必答 #
218561次浏览 1662人参与
# 选实习,你更看重哪方面? #
13549次浏览 214人参与
# 牛客十周岁生日快乐 #
197768次浏览 1895人参与