You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

345 lines
12 KiB

@{
ViewData["Title"] = "WebSocket测试";
}
<style>
.websocket-test-container {
max-width: 100%;
}
/* 页面内容滚动区域 */
.websocket-scroll-area {
max-height: calc(100vh - 300px); /* 固定最大高度,避免页面滚动 */
overflow-y: auto;
overflow-x: hidden;
padding-right: 10px; /* 为滚动条留出空间 */
}
/* 自定义滚动条样式 */
.websocket-scroll-area::-webkit-scrollbar {
width: 8px;
}
.websocket-scroll-area::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
.websocket-scroll-area::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
.websocket-scroll-area::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
font-weight: 600;
color: #495057;
margin-bottom: 0.5rem;
}
.form-control {
border-radius: 0.375rem;
border: 1px solid #ced4da;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.form-control:focus {
border-color: #80bdff;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
.btn {
border-radius: 0.375rem;
font-weight: 500;
transition: all 0.2s;
}
.btn:hover {
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.message-log {
height: 350px; /* 调整高度以适应滚动区域 */
overflow-y: auto;
background-color: #f8f9fa;
padding: 15px;
border-radius: 0.5rem;
border: 1px solid #dee2e6;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 0.9em;
}
.message-item {
margin-bottom: 0.75rem;
padding: 0.5rem;
border-radius: 0.25rem;
background-color: white;
border-left: 3px solid #dee2e6;
}
.message-item.system {
border-left-color: #6c757d;
}
.message-item.send {
border-left-color: #007bff;
}
.message-item.receive {
border-left-color: #28a745;
}
.message-item.error {
border-left-color: #dc3545;
}
.status-badge {
font-size: 0.875rem;
padding: 0.5rem 1rem;
}
.connection-panel {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border: 1px solid #dee2e6;
}
.message-panel {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border: 1px solid #dee2e6;
}
/* 响应式调整 */
@@media (max-width: 768px) {
.websocket-scroll-area {
max-height: calc(100vh - 250px);
}
.message-log {
height: 300px;
}
}
@@media (max-width: 576px) {
.websocket-scroll-area {
max-height: calc(100vh - 200px);
}
.message-log {
height: 250px;
}
}
</style>
<div class="container">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-plug"></i> WebSocket测试
</h3>
</div>
<div class="card-body p-0">
<div class="websocket-scroll-area">
<div class="p-4">
<div class="row">
<div class="col-md-6">
<div class="card connection-panel">
<div class="card-header">
<h5 class="card-title">
<i class="fas fa-link"></i> 连接状态
</h5>
</div>
<div class="card-body">
<div class="form-group">
<label for="serverUrl">服务器地址</label>
<input type="text" class="form-control" id="serverUrl" value="ws://192.168.13.12:9001" placeholder="ws://localhost:9001">
</div>
<div class="form-group mt-3">
<button type="button" class="btn btn-success" id="connectBtn" onclick="connect()">
<i class="fas fa-play"></i> 连接
</button>
<button type="button" class="btn btn-danger" id="disconnectBtn" onclick="disconnect()" style="display:none;">
<i class="fas fa-stop"></i> 断开
</button>
</div>
<div class="mt-3">
<span class="badge status-badge" id="statusBadge">未连接</span>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card message-panel">
<div class="card-header">
<h5 class="card-title">
<i class="fas fa-paper-plane"></i> 消息发送
</h5>
</div>
<div class="card-body">
<div class="form-group">
<label for="messageInput">消息内容</label>
<textarea class="form-control" id="messageInput" rows="3" placeholder="输入要发送的消息"></textarea>
</div>
<div class="form-group mt-3">
<button type="button" class="btn btn-primary" onclick="sendMessage()" id="sendBtn" disabled>
<i class="fas fa-send"></i> 发送
</button>
<button type="button" class="btn btn-secondary" onclick="clearMessages()">
<i class="fas fa-trash"></i> 清空消息
</button>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5 class="card-title">
<i class="fas fa-list"></i> 消息日志
</h5>
</div>
<div class="card-body">
<div id="messageLog" class="message-log">
<div class="text-muted">等待连接...</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@section Scripts {
<script>
var websocket = null;
var messageLog = document.getElementById('messageLog');
var statusBadge = document.getElementById('statusBadge');
var connectBtn = document.getElementById('connectBtn');
var disconnectBtn = document.getElementById('disconnectBtn');
var sendBtn = document.getElementById('sendBtn');
var messageInput = document.getElementById('messageInput');
function connect() {
var url = document.getElementById('serverUrl').value;
if (!url) {
alert('请输入服务器地址');
return;
}
try {
websocket = new WebSocket(url);
websocket.onopen = function(event) {
updateStatus('已连接', 'success');
addMessage('系统', '连接已建立', 'success');
connectBtn.style.display = 'none';
disconnectBtn.style.display = 'inline-block';
sendBtn.disabled = false;
};
websocket.onmessage = function(event) {
addMessage('接收', event.data, 'info');
};
websocket.onclose = function(event) {
updateStatus('已断开', 'secondary');
addMessage('系统', '连接已断开', 'warning');
connectBtn.style.display = 'inline-block';
disconnectBtn.style.display = 'none';
sendBtn.disabled = true;
};
websocket.onerror = function(error) {
updateStatus('连接错误', 'danger');
addMessage('系统', '连接错误: ' + error, 'danger');
};
} catch (error) {
alert('连接失败: ' + error.message);
}
}
function disconnect() {
if (websocket) {
websocket.close();
websocket = null;
}
}
function sendMessage() {
var message = messageInput.value.trim();
if (!message) {
alert('请输入要发送的消息');
return;
}
if (websocket && websocket.readyState === WebSocket.OPEN) {
websocket.send(message);
addMessage('发送', message, 'primary');
messageInput.value = '';
} else {
alert('WebSocket未连接');
}
}
function addMessage(type, content, color) {
var timestamp = new Date().toLocaleTimeString();
var messageDiv = document.createElement('div');
messageDiv.className = 'message-item ' + type.toLowerCase();
messageDiv.innerHTML = `
<small class="text-muted">[${timestamp}]</small>
<span class="badge badge-${color}">${type}</span>
<span class="ml-2">${escapeHtml(content)}</span>
`;
messageLog.appendChild(messageDiv);
messageLog.scrollTop = messageLog.scrollHeight;
}
function updateStatus(status, color) {
statusBadge.textContent = status;
statusBadge.className = 'badge status-badge badge-' + color;
}
function clearMessages() {
messageLog.innerHTML = '<div class="text-muted">消息已清空</div>';
}
function escapeHtml(text) {
var div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// 回车键发送消息
messageInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
sendMessage();
}
});
// 页面卸载时断开连接
window.addEventListener('beforeunload', function() {
if (websocket) {
websocket.close();
}
});
</script>
}