我与IBM i(AS / 400)建立了连接,该连接通过称为TN5250的协议/编码进行通信。我无法将其与任何编码listed here匹配;如何将该文本转换为可以使用的内容? UTF8,ASCII; Windows友好的文本格式的任何内容都可以。它不得涉及购买第三方库。
这是我在其他地方找到的一些“有效”代码。 “地址”是IP地址。
Socket SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(IPAddress.Parse("address"), 23);
SocketClient.Connect(remoteEndPoint);
byte[] buffer = new byte[10];
textBox1.Text += Receive(SocketClient, buffer, 0, buffer.Length, 10000).Trim() + "\r\n";
}
public static string Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
int startTickCount = Environment.TickCount;
int received = 0; // how many bytes is already received
do
{
if (Environment.TickCount > startTickCount + timeout)
throw new Exception("Timeout.");
try
{
received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
return Encoding.GetEncoding(37).GetString(buffer, 0, buffer.Length);
//byte[] buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buffer);
//return Encoding.GetEncoding("IBM500").GetString(buf, 0, buffer.Length);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.WouldBlock ||
ex.SocketErrorCode == SocketError.IOPending ||
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
{
// socket buffer is probably empty, wait and try again
Thread.Sleep(30);
}
else
throw ex; // any serious error occurr
}
} while (received < size);
return "";
}
这是Telnet连接。在Windows telnet窗口中工作正常。我真正想要的解决方案是一种从telnet会话捕获stdout的方法,但是很显然,像Telnet这样的终端程序不会写入stdout。
最佳答案
TN5250J项目是使用Java编写的有效的TN5250客户端。
TN5250是基于Telnet的IBM协议。它适用于IBM中端系列“哑”绿屏终端。该系列是块模式,这意味着主机通过一次传输将完整的显示面板发送给客户端,而客户端通过一次传输将完整的显示面板发送回主机。这与逐字符传输相反。
作为一个非常高级的概述,5250协议描述了如何格式化显示(开始/停止字段,下划线和颜色之类的字段属性)以及可接受的功能键。客户端需要了解这些格式化说明,以便正确呈现来自主机的数据。同样,客户端不会发送回完整的显示面板,包括常量和格式;相反,它将发送回具有输入能力的字段。
本身没有标准输出;可读的显示面板需要客户端渲染。通过使用Wireshark捕获数据包并将它们与显示相同事务的实际TN5250显示器进行比较,您可能会对原始数据有很好的了解。