我正在写一个网络终端以获得乐趣。我使用xterm js + pty。我有一个linux服务器,客户端使用websocket连接到它。 websocket将向服务器发送消息,该消息将被发送到由pty生成的终端。任何输出都将通过websocket发送回xterm中的客户端。一切正常。
但是在不稳定的网络中,我想在断开连接后重新连接websocket。我就是这样处理的。
function createWebSocket() {
var socket = new WebSocket(socketUri);
socket.onopen = handleSocketOpen;
socket.onclose = handleSocketClose;
}
function handleSocketClose() {
term.writeln("\n\r\x1B[1;31mTerminal was disconnected.\x1B[0m ");
retryConnectClosedSocketOrCleanup(1);
}
function retryConnectClosedSocketOrCleanup(retryCount) {
// Get current term size.
var method = 'POST';
var geometry = term.proposeGeometry();
var targetUri = consoleUri + '/terminals/' + termId + '/size?cols=' + geometry.cols + '&rows=' + geometry.rows;
// Resize terminal to detect if the terminal exists on the server.
$.ajax(targetUri,
{
method: method,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
timeout: 3000
})
.fail(function (jqXHR, textStatus, errorThrown) {
// If resize failed with 4xx or 5xx, then there is no way to reconnect to the same terminal.
// Do socket close clean up right away.
if (jqXHR.status >= 400) {
console.warn("Terminal failed to reconnect because the previous session no longer exists.");
socketCloseCleanup();
return;
}
// If resize failed with other reason, retry.
retryCount = retryCount || 0;
if (retryCount > maxRetrySocketConnectionCount) {
term.writeln("\n\r\x1B[1;31mTerminal failed to reconnect after " + maxRetrySocketConnectionCount + " attempts. \x1B[0m");
socketCloseCleanup();
} else {
term.write(retryCount == 1 ? "\n\r\x1B[1;31mReconnecting terminal.." : "\x1B[1;31m.");
setTimeout(function () { retryConnectClosedSocketOrCleanup(retryCount + 1) }, retrySocketConnectionDelay);
}
})
.done(function (data, textStatus, jqXHR) {
// If resize was successful, then the terminal still exists on the server.
// Reopen socket.
if (jqXHR.status === 200) {
term.writeln("\x1B[1;32m Terminal reconnected.\x1B[0m ");
term.fit();
term.clear();
term.eraseLine(0);
createWebSocket();
}
});
}

在大多数情况下它也可以正常工作。但是,一旦我使用" vi"或者" vim",任何重新连接都会导致最后出现一些奇怪的字符。
我搜索了很多,但没有找到太多。我发现的唯一的东西是here,看起来像是来自termcap的一堆错误响应。
跟进: 我发现问题实际上来自客户端的xterm js。这是我做的:
我将console.log添加到xterm js attach addon,看看是否是重新连接后首先将这些字符发送到服务器的xterm js。事实证明"是"。请参阅控制台日志。
打开vim后,我断开了互联网的连接。这个日志在重新连接后就出现了。正如您所看到的,终端(xterm js Terminal对象)首先使用这些字符发送到套接字,并通过套接字从服务器接收到相同的内容。 我搜索了xterm js的代码库,看起来这些字符是从https://github.com/sourcelair/xterm.js/blob/42724c7f42f827d9e247d461066eb1506725e371/src/Parser.ts#L526-L535生成的。
有什么想法吗?