我在当有人打印文件,使用文本数据为节目所需要的内容。如何读取文件的从端口
我对TCP/IP客户端和监听程序的基本思路。 我已经可以在两台机器之间发送和接收txt文件。 但如何接收文件内容,如果文件是在DOCX,心连心,PDF或任何其他形式?
我的要求是,
我想,当有人打印文件使用一个文件的内容(文本)到另一个程序。 如果有其他方法可以做到,请给我建议。
提前致谢。
我在当有人打印文件,使用文本数据为节目所需要的内容。如何读取文件的从端口
我对TCP/IP客户端和监听程序的基本思路。 我已经可以在两台机器之间发送和接收txt文件。 但如何接收文件内容,如果文件是在DOCX,心连心,PDF或任何其他形式?
我的要求是,
我想,当有人打印文件使用一个文件的内容(文本)到另一个程序。 如果有其他方法可以做到,请给我建议。
提前致谢。
既然你还没有发布任何代码,我会写的“我的路”的代码的一部分,但你应该看完这个有一点了解。
首先在两端(客户端和服务器),你应该适用统一的协议,该协议将描述您发送的数据。示例可以是:
[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());
}
}
这种方法相当容易实现,并且如果您想发送不同的文件类型,不需要大的更改。它缺少一些验证器,但我认为你不需要这个功能。
优秀... !!感谢您的解释和示例.. –
另一个疑问是如何处理发件人是否是打印文件到IP端口的打印机,并且接收者是从该端口捕获的我的程序? –
@AmjadhNm然后这台打印机应该有一些在文档中指定的协议。每个通过网络发送内容的设备都有自己的协议,必须在文档中指定。 –
谁发送先发内容的大小,后插口,接收会知道有多少字节接收内容的插座。收到内容后,只需将字节保存为任何文件格式即可。为了使发送者更容易发送文件格式。如果你问如何检测它是哪种格式,那么你需要对内容进行模式匹配,看它是否与特定的文件格式相匹配。 – Bauss