2017-01-24 57 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然后这台打印机应该有一些在文档中指定的协议。每个通过网络发送内容的设备都有自己的协议,必须在文档中指定。 –