Csharp/C#教程:在C#中从服务器向客户端发送一些约束分享


在C#中从服务器向客户端发送一些约束

我在C#中使用套接字编程创建了一个简单的服务器,它将从客户端接收文件。 我的示例代码段如下所示。

我想添加一些限制。 我想限制文件大小(例如4 KB或2 KB)和允许的文件格式(例如.doc,.txt,.cpp等),这些格式将在客户端发送到客户端连接到服务器,以便客户端可以相应地发送文件。 我该怎么做?

示例代码段:

using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.IO; using System.Text; namespace FileTransfer { class Program { static void Main(string[] args) { // Listen on port 1234 TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234); tcpListener.Start(); Console.WriteLine("Server started"); //Infinite loop to connect to new clients while (true) { // Accept a TcpClient TcpClient tcpClient = tcpListener.AcceptTcpClient(); Console.WriteLine("Connected to client"); byte[] data = new byte[1024]; NetworkStream ns = tcpClient.GetStream(); int recv = ns.Read(data, 0, data.Length); StreamReader reader = new StreamReader(tcpClient.GetStream()); //Will add some lines to add restrictions... } } } } 

我还需要添加哪些代码才能将限制发送给客户端?

基本上我认为主要是你需要两件事:

对于处理部分读取(不确定write需要多少这样的function),您可以使用如下函数:

 public static void ReadWholeArray (Stream stream, byte[] data) { int offset=0; int remaining = data.Length; while (remaining > 0) { int read = stream.Read(data, offset, remaining); if (read <= 0) throw new EndOfStreamException (String.Format("End of stream reached with {0} bytes left to read", remaining)); remaining -= read; offset += read; } } 

事情是传统的Stream.Read()不保证读取你告诉它的字节数,另一方面,这个方法将确保读取data.Length参数中指定的字节数。 因此,您可以使用此类函数来实现所需的应用程序协议。

您可以在此处找到有关此类应用程序协议的一些相关信息


好的,这是例如服务器如何发送文件长度限制和文件扩展名:

 // Send string string ext = ".txt"; byte [] textBytes = Encoding.ASCII.GetBytes(ext); ns.Write(textBytes, 0, textBytes.Length); // Now, send integer - the file length limit parameter int limit = 333; byte[] intBytes = BitConverter.GetBytes(limit); ns.Write(intBytes, 0, intBytes.Length); // send integer - mind the endianness 

但是你仍然需要某种协议,否则你应该让客户端读取“完整”流并稍后以某种方式解析这些数据,如果数据没有固定的长度等,这不是微不足道的 - 否则客户将如何区分哪个消息的一部分是文本,哪个整数?

你似乎正在犯古典套接字错误。 给定的代码和解释似乎假设消息中的套接字句柄。 他们没有 。 以这种方式使用时,您使用的是流式互联网套接字 ,它提供流而不是消息

您没有显示任何执行实际发送的代码,因此我猜您只是将文件的数据泵到另一侧并关闭连接。 你怎么知道你已经成功转移了整个文件?

客户端和服务器为了通过套接字有用地交换数据而必须遵循的这组规则称为应用程序协议 。 你不得不拥有一个,否则你只是将数据发送到$ deity知道在哪里,你根本就无法控制它。 这意味着服务器和客户端将知道发生了什么,他们只是发送和接收数据,并希望一切顺利。 因此,您不必在代码中添加“几行”,您必须完全重组它。

有许多方法可以定义应用程序协议和许多可供选择的选项,因此我将向您展示一个任意的:对带有ID和有效负载长度(如果适用)作为前缀的消息的文本说明,两者都在未指定的数字变量。 例如,您可以选择小端四字节无符号整数。

这种格式的消息称为“类型/长度/值”或TLV 。 所以我们定义这些消息:

 ID Name Direction Description Payload 1 ServerHello Server -> Client The server sends this message None. to every connecting client. Or maybe server or protocol version. 2 MaxUpload Server -> Client Sent after the ServerHello. Maximum upload size in bytes. 3 AllowedExts Server -> Client Allowed upload extensions, The allowed extensions. comma-separated. Sent after MaxUpload message. 10 IncomingFile Client -> Server There's a file coming. The file name. 11 FileUpload Client -> Server The file to upload. The file data. Sent after IncomingFile. 

现在所需要的只是在服务器和客户端中实现此应用程序协议,您就完成了。

如果客户端或服务器不遵守prototol,您还必须决定该怎么做。 例如,它可以发送您无法解析的消息,未知消息ID,您不想支持的消息长度,无序消息(IncomingFile之前的FileUpload)或非消息消息符合之前发送的消息,例如客户端上传的文件大于服务器所说的可接受的文件或无效的扩展名。 您还必须考虑“确认”或响应消息,例如服务器告诉客户端“好的,继续,发送下一条消息”。

总而言之,这是一个非常广泛的问题,而且不容易回答。 我试着在我对您的问题的评论中解决这个问题,该问题已被删除。 所以,你有答案。

您可以在网上了解更多相关信息,例如,由Giorgi链接的Beej网络编程指南 (请务必阅读整个指南)和Stephen Cleary的博客 。

上述就是C#学习教程:在C#中从服务器向客户端发送一些约束分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009945.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐