2017-01-24 59 views
0

我在當有人打印文件,使用文本數據爲節目所需要的內容。如何讀取文件的從端口

我對TCP/IP客戶端和監聽程序的基本思路。 我已經可以在兩臺機器之間發送和接收txt文件。 但如何接收文件內容,如果文件是在DOCX,心連心,PDF或任何其他形式?

我的要求是,

我想,當有人打印文件使用一個文件的內容(文本)到另一個程序。 如果有其他方法可以做到,請給我建議。

提前致謝。

+0

誰發送先發內容的大小,後插口,接收會知道有多少字節接收內容的插座。收到內容後,只需將字節保存爲任何文件格式即可。爲了使發送者更容易發送文件格式。如果你問如何檢測它是哪種格式,那麼你需要對內容進行模式匹配,看它是否與特定的文件格式相匹配。 – Bauss

回答

0

既然你還沒有發佈任何代碼,我會寫的「我的路」的代碼的一部分,但你應該看完這個有一點了解。

首先在兩端(客戶端和服務器),你應該適用統一的協議,該協議將描述您發送的數據。示例可以是:

[3字節 - ASCII擴展] [4字節 - lengthOfTheFile] [XBytes - fileContents]

然後在你的發送方可以根據這意味着第一您的讀3的協議來接收數據字節來決定什麼格式的文件,然後你讀4個字節,這基本上會告訴你有多大的文件正在傳播。最後,你必須閱讀內容並直接寫入文件。例如發送者看起來是這樣的:

byte[] extensionBuffer = new byte[3]; 
if(3 != networkStream.Read(extensionBuffer, 0, 3)) 
    return; 

string extension = Encoding.ASCII.GetString(extensionBuffer); 
byte[] lengthBuffer = new byte[sizeof(int)]; 
if(sizeof(int) != networkStream.Read(lengthBuffer, 0, 3)) 
    return; 

int length = BitConverter.ToInt32(lengthBuffer, 0); 
int recv = 0; 
using (FileStream stream = File.Create(nameOfTheFile + "." + extension)) 
{ 
    byte @byte = 0x00; 
    while((@byte = (byte)networkStream.ReadByte()) != 0x00) 
    { 
     stream.WriteByte(@byte); 
     recv++; 
    } 
    stream.Flush(); 
} 

發件人部分就可以讀取文件的擴展名,然後打開文件流獲得流的長度,然後發送流長到客戶端和「重定向」每個字節從FileStream變成networkStream。這看起來像這樣:

FileInfo meFile = //.. get the file 
byte[] extBytes = Encoding.ASCII.GetBytes(meFile.Extension); 
using(FileStream stream = meFile.OpenRead()) 
{ 
    networkStream.Write(extBytes, 0, extBytes.Length); 
    networkStream.Write(BitConverter.GetBytes(stream.BaseStream.Length)); 
    byte @byte = 0x00; 
    while (stream.Position < stream.BaseStream.Length) 
    { 
     networkStream.WriteByte((byte)stream.ReadByte()); 
    } 
} 

這種方法相當容易實現,並且如果您想發送不同的文件類型,不需要大的更改。它缺少一些驗證器,但我認爲你不需要這個功能。

+0

優秀... !!感謝您的解釋和示例.. –

+0

另一個疑問是如何處理髮件人是否是打印文件到IP端口的打印機,並且接收者是從該端口捕獲的我的程序? –

+0

@AmjadhNm然後這臺打印機應該有一些在文檔中指定的協議。每個通過網絡發送內容的設備都有自己的協議,必須在文檔中指定。 –