Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从端口读取文件内容_C#_Sockets_Network Programming_Listener - Fatal编程技术网

C# 如何从端口读取文件内容

C# 如何从端口读取文件内容,c#,sockets,network-programming,listener,C#,Sockets,Network Programming,Listener,当有人打印文件时,我需要在程序中使用文本数据 我对TCP/IP客户端和侦听器编程有基本的了解。 我已经可以在两台机器之间发送和接收txt文件了。 但是,如果文件是docx、xlx、pdf或任何其他格式,如何接收文件内容呢 我的要求是, 当有人打印文件时,我想将文件的内容(文本)输入到另一个程序中。 如果有其他方法,请告诉我 提前感谢。由于您没有发布任何代码,我将以“我的方式”编写代码部分,但您在阅读本文后应该会有一点了解 首先,在两端(客户端和服务器端),您应该应用统一的协议,该协议将描述您正在

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

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

我的要求是,

当有人打印文件时,我想将文件的内容(文本)输入到另一个程序中。 如果有其他方法,请告诉我


提前感谢。

由于您没有发布任何代码,我将以“我的方式”编写代码部分,但您在阅读本文后应该会有一点了解

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

[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
中的每个字节“重定向”到
网络流中。这可能看起来像:

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());
    }
}
FileInfo meFile=/。。获取文件
byte[]extBytes=Encoding.ASCII.GetBytes(meFile.Extension);
使用(FileStream stream=meFile.OpenRead())
{
networkStream.Write(extBytes,0,extBytes.Length);
networkStream.Write(BitConverter.GetBytes(stream.BaseStream.Length));
字节@字节=0x00;
while(stream.Position

这种方法相当容易实现,如果您想发送不同的文件类型,则不需要进行重大更改。它缺少一些验证器,但我认为您不需要此功能。

发送内容的套接字应首先发送内容的大小,然后接收内容的套接字将知道接收内容的字节数。接收到内容后,只需将字节以任何文件格式保存即可。为了方便起见,发件人还可以发送文件格式。如果您询问如何检测它是哪种格式,那么您需要对内容进行模式匹配,以查看它是否匹配特定的文件格式。另一个疑问是,如果发送者是一台将文件打印到IP端口的打印机,如何处理,接收器是我的程序,它从那个端口捕获?@AmjadhNm那么这个打印机应该有文档中指定的协议。每个通过网络发送信息的设备都有自己的协议,必须在文档中指定。