自己動手編制支持終端打印的TELNET程序
發表于:2007-07-14來源:作者:點擊數:
標簽:
前言:在行業用戶中,大多數基層計算機應用系統采用 UNIX 作OS,用支持RS232連接的終端做業務處理,打印也通過終端實現。隨著PC機擁有量的不斷增加,通過網卡、HUB,就可把 服務器 與PC 機連接起來,然后在PC機上用TELNET登錄上服務器,就可把PC機作終端用了
前言:在行業用戶中,大多數基層計算機應用系統采用
UNIX作OS,用支持RS232連接的終端做業務處理,打印也通過終端實現。隨著PC機擁有量的不斷增加,通過網卡、HUB,就可把
服務器與PC 機連接起來,然后在PC機上用TELNET登錄上服務器,就可把PC機作終端用了。美中不足的是無法在PC機上實現終端打印,某些TELNET類軟件,也只支持透明打印方式的一種指令,無法滿足終端打印的要求。為了減少硬件的投入,提高現有設備的利用率,我們自己動手做了一個這樣的軟件,能使PC機完全代替終端使用,暫且稱該軟件為TELVT100,下面來一步一步實現它。
首先,考慮一下TELVT100要實現哪些功能:一、PC機與服務器的連接;二、能虛擬終端顯示,目前,絕大部分UNIX上的應用系統支持VT100終端類型,因此,主要實現VT100終端類型的虛擬;三、把打印內容進行轉換并送到與PC機相連的打印機上。
現在,分步驟對以上三部分說明,我們采用
VB5.0作為開工具,由于程序條數較多,所以只列出與主要文字敘述相關的部分程序段。
‘變量的定義及初始化
Public Ztdi As Integer
Public IPAddR As String
Public RmtPtr as Integer
Public DaBulen as Long
......
Private Sub Form_Load() ‘初始化處理
Ztdi = Printer.Font.Size ‘打印字體大小
IPAddR = "32.145.24.1" ‘設置服務器的IP地址
RmtPtr = 0 ‘指令指針
DaBuLen = 0 ‘打印緩存大小
Winsock.Protocol = 0 ‘設定協議為TCP/IP
......
End Sub
一、 PC機與服務器的TELNET連接
要實現PC機與服務器的TELNET協議連接,必須先以TCP/IP協議連接PC機與服務器。給服務器端加網卡,并對網卡和TCP/IP協議進行設置,開放TELNET連接,設置端口地址為23。給PC機裝上網卡,并配置網卡和TCP/IP協議。我們在PC機上編制相應的客戶端程序,來實現TCP/IP連接。在這里主要用到VB中Winsock控件,下面了解一下它的有關
性能。它提供了訪問TCP/IP
網絡服務的方便途徑,用它編寫客戶端應用程序,不必了解TCP/IP的細節,通過設置控件的屬性并調用其方法就可連接到服務器上去,即把控件的RemoteHost屬性設置為服務器的IP 地址,把RemotePort屬性設置為服務器“偵聽”的端口地址(上文提到的端口地址23),然后調用Connect方法實現與指定的IP地址服務器連接。建立連接后,服務器與PC機就可以互相收發數據。為了發送數據,要調用SendData方法。當客戶端接收到數據時會發生 DataArrival 事件,在DataArrival事件內調用GetData方法就可獲取數據。
連接建好后,PC機與服務器用TELNET協議命令建立協調機制。命令共有15條,每條命令前都要加上字符IAC(255),指出緊跟著的字符是命令。代碼250和代碼240用作命令的分界符,其余命令可分為兩類。(一)基本命令:由代碼241-249代表,它們執行TELNET的基本功能;(二)磋商選擇命令:由代碼251-254表示,這類命令主要實現兩進程間磋商各種可選擴充功能。命令列表(1),詳細解釋,請查閱有關資料。
二、 實現VT100終端類型的虛擬
(一)、在有關窗體上加入一個TEXT控件,設為Text1,在Text1.KeyPress事件中,獲得PC機的鍵盤輸入,然后把相應鍵值變更為VT100終端鍵盤所對應的鍵值,把該值用Winsock控件的SendData方法發送給服務器,并禁止向TEXT控件的輸出。
(二)、服務器接收鍵值后,作出相應的處理,并把輸出的內容發送給對應的客戶端,我們在Winsock控件的DataArrival事件中調用Winsock控件的GetData方法,來獲得服務器發來的數據。
(三)、我們獲得的從服務器發來的數據中,包含終端的控制指令。必須把控制指令分離出來,并做相應處理,同時把顯示數據送到顯示界面的指定位置。有關VT100終端指令的詳細說明,請查閱有關技術手冊,這里以光標定位指令ESC[Pr;Pc H舉例說明。該指令的解釋為:把顯示界面的光標移動到第Pr行,第Pc列,Pr、Pc均為10進制數字,Pr值在1-24中,Pc值在1-80中。我們可把顯示界面看做24X80的矩陣,每一個矩陣點上是一個字符,假設Pr=10,Pc=30,那么對該指令的執行結果,就是把對應光標位置的指針移到顯示界面的顯存偏移(10-1)*80+30的地方。具體實現過程如下:
‘***接收鍵盤輸入、與服務器連接并向服務器發送***
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim ch as String
‘判斷網絡連接是否處于正常狀態
If Winsock1.State <> 0 And Winsock1.State <> 7 Then
ch = MsgBox("網絡異常,請重新連接!")
KeyAscii = 0 ‘封鎖鍵盤輸入
Exit Sub ‘退出本事件
End If
If Winsock1.State = 0 Then ‘網絡處于斷開狀態
IPADDR=Winsock1.RemoteHost
Winsock1.Connect IPAddR, 23 ‘與服務器連接
Else
Winsock1.SendData StrConv(Chr(KeyAscii), 8) ‘向服務器發送鍵盤輸入
End If
KeyAscii = 0 ‘禁止向Text控件送鍵值
End Sub
‘***接收服務器向客戶端發送的數據***
Private Sub newRecdata(CHRR As Variant) ‘虛擬終端處理函數
......
Print_ComX CHRR ‘調用打印指令處理函數
......
End Sub
Private Sub Te
.net_Com(CHRR As Variant) ‘TELNET指令過濾函數
‘要把相應的應答指令直接發送給服務器
......
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ‘數據到達以后,觸發該事件
Dim CHRR As Variant
Winsock1.GetData CHRR ‘讀取接收到的數據
Telnet_Com CHRR ‘TELNET指令過濾函數
newRecdata CHRR ‘虛擬終端處理函數
End Sub
三、 在PC機上實現終端打印
在終端機上主要有屏幕打印、拷貝打印、透明打印、控制打印、格式打印等打印形式,一般用在業務處理上的主要用透明打印和控制打印,這里主要介紹透明打印和控制打印。
(一)、透明打印的實現
在透明打印方式下,終端從服務器收到的字符除(11H)和(13H)外均不處理,全部送到打印機去,這種方式一般適用于帶有漢字字庫的打印機。應用程序發出ESC[5i控制指令,指出隨后送出的字符是透明打印的內容,發出ESC[4i控制指令指出透明打印結束。根據以上敘述,在用Winsock控件的GetData方法獲得的字符串中出現ESC[5i控制指令時,就要把隨后的字符送到打印端口,而不是送到顯示界面對應的顯存,在GetData方法獲得的字符串中出現ESC[4i控制指令時,就要把隨后的字符送到顯示界面對應的顯存,而停止送到打印端口。假設打印機接在LPT1端口,把字符串送到打印機的例程如下:
Private Print_ComT1(DayBuf as String) ‘透明打印處理函數
......
Open "LPT1:" For Binary A
clearcase/" target="_blank" >ccess Write As #1 ‘把打印機作為文件打開
If DaBuLen > 0 Then ‘斷判是否有打印數據
Put #1, , StrConv(DayinBuf,
vbUnicode) ‘把數據送到打印機
End If
Close #1
......
End Sub
(二)、控制打印的實現
控制打印的實現比透明打印相對而言要復雜些,在控制打印方式下,打印的漢字字形、行距、字距控制等均使用終端命令實現,對打印機的要求是能支持圖形打印。當終端收到ESC[/5i控制指令時,終端對隨后收到的字符串,作為控制打印的內容(內含打印屬性命令)進行處理,當終端收到ESC[/4i控制指令時,結束控制打印??刂拼蛴〉拇蛴傩悦钣袔追N,詳細解釋,請查閱相關資料,這里以ESC[/PsT命令來舉例。Ps=0時,字符大小正常;Ps=1時,字符橫向放大到2倍;Ps=2時,字符縱向放大到2倍;Ps=3時,字符橫、縱各放大到2倍。顯然,從上面的說明可以看出,打印屬性命令,必須由TELVT100程序來解釋,并對有關打印字符串進行處理,然后將處理過的內容交給打印機。這里將用到一個VB當中的對象PRINTER來完成控制打印功能,使用PINNTER對象,我們可以實現與打印機的通訊。用圖形方法在 Printer 對象上繪制文本和圖形后,可用 EndDoc 方法直接將打印信息送到打印機上。這里主要用到Printer對象的Print方法,它的功能就是把指定字符串送到Printer 對象上,還要用到Font屬性等,具體用法舉例說明如下:
Private Static Sub Print_Com2(Dayinbuf as String) ‘控制打印處理函數
Dim PPart() As Byte
Dim i, j As Long
Dim Combuf(12) as Byte
Dim CombufPtr As Long
......
For i = 0 To DaBuLen - 1
Select Case DayinBuf(i)
......
If CombufPtr <> 0 Then ‘判斷是否有打印內容
Printer.Print StrConv(PPart, vbUnicode) ‘把待打印內容送到Printer打印對象
CombufPtr = 0 ‘指針復位
......
Select Case Combuf(RmtPtr)
Case Asc("T") ‘打印屬性指令ESC[/Ps T
Select Case Combuf(RmtPtr - 1)
Case 48
Printer.Font.Size = Ztdi ‘字體為正常大小
......
Case 51
Printer.Font.Size = 2 * Ztdi ‘字體橫、縱各放大到二倍
......
End Select
......
End Select
......
End Select
.....
next i
If CombufPtr <> 0 Then
Printer.Print StrConv(PPart, vbUnicode) ‘把待打印內容送到Printer打印對象
......
Printer.EndDoc
End If
End Sub
另外,在透明打印的實現上,可以采用控制打印的實現方法,這里涉及到對打印機指令進行解釋的問題。在與本地服務器的連接上,可以象終端一樣,把連接到終端的線纜直接連接到PC機的RS232口上,然后在TELVT100程序中加入MSCOMM控件,設置適當的通訊參數,用該控件的Input、Output方法進行數據收發,可以完全模仿終端使用。
經過以上各個過程,我們的TELVT100就近在眼前了。由于篇幅所限,不能面面具到,只給大家提供一個主體框架,想起到拋磚引玉的效果,希望和感興趣的各位一起分享成功帶來的歡樂。本程序已經被試用了一段時間,反映情況良好。
結束語:現在國內正流行數據的整合、集中,行業用戶的業務處理系統在上一級部門的服務器上運行,基層單位往往采用終端服務器通過數據專線遠程連接到上級部門。使用TELVT100這樣的程序,可以不用終端服務器,而直接用PC機遠程登錄到業務處理系統服務器,進行業務處理。
原文轉自:http://www.anti-gravitydesign.com