gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:54:07 25 4
gpt4 key购买 nike

我已经使用 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...

}
}
}
}

我必须在代码中添加哪些附加行才能将限制发送给客户端?

最佳答案

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

  • 按照其他答案中的建议定义应用程序协议(protocol)

  • 并处理部分读/写

为了处理部分读取(不确定write 需要多少这样的函数)你可以使用像below 这样的函数:

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 参数。因此,您可以使用此类函数来实现所需的应用程序协议(protocol)。

您会发现有关此类应用程序协议(protocol)的一些相关信息here也是


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

// 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

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

关于c# - 在 C# 中从服务器向客户端发送一些约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com