【问题标题】:How to read the content of file from port如何从端口读取文件内容
【发布时间】:2017-01-24 07:39:08
【问题描述】:

当有人打印文件时,我需要在程序中使用文本数据。

我对 TCP/IP 客户端和侦听器编程有基本的想法。 我已经可以在两台机器之间发送和接收 txt 文件了。 但是,如果文件是 docx、xlx、pdf 或任何其他格式,如何接收文件内容?

我的要求是,

当有人打印文件时,我想将文件的内容(文本)用于另一个程序。 如果有其他方法,请建议我。

提前致谢。

【问题讨论】:

  • 发送的套接字应该首先发送内容的大小,然后接收的套接字将知道要接收多少字节的内容。收到内容后,您只需将字节保存为任何文件格式。为了更容易,发件人还可以发送文件格式。如果您要问如何检测它是哪种格式,那么您需要对内容进行模式匹配以查看它是否与特定的文件格式匹配。

标签: c# sockets network-programming listener


【解决方案1】:

由于您没有发布任何代码,我将按照“我的方式”编写代码部分,但您在阅读后应该有所了解。

首先在两端(客户端和服务器)上,您应该应用统一协议,该协议将描述您发送的数据。示例可能是:

[3Bytes - ASCII 扩展名][4Bytes - 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 那么这台打印机应该有一些在文档中指定的协议。每个通过网络发送内容的设备都有自己的协议,必须在文档中指定。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2011-09-16
  • 1970-01-01
  • 2016-11-02
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多