我正在构建一个简单的服务器,它包含一些信息,并将使用异步套接字来获取N个连接(我真的不知道有多少,它们的范围可以从50到1000) .
此服务器的主要目的是“验证”连接的客户端的文件完整性和版本,并在需要时向他们发送更新的文件,以便他们可以进行修补 .
现在,我正在让我的套接字运行,我可以在控制台中显示数据,一切都很好,问题是,我最重要的变量是在我的'DownloadServer'类上,而我的套接字函数是打开的一个名为'ServerSocket'的类 .
我的问题是,当我的套接字请求所述信息时,如何访问DownloadServer中的数据(包含ServerSocket的实例) . 我无法返回使用Async Callbacks收到的数据(因为它们必须无效),那么最好的方法是什么呢?
这是我的套接字代码,它只接收客户端并打印发送的数据 . 我想要做的是访问收到的信息(例如,同样的命令)并返回给客户端请求信息,例如,如果收到的消息是“GetFileVersion”,服务器应该回复变量的值它包含(它是一个名为FILEVERSION的全局变量),这是我似乎无法找到访问该变量的方法的问题 .
class ServerSocket
{
private Socket _socket;
private byte[] _buffer;
public ServerSocket()
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void bind(int port)
{
_socket.Bind(new IPEndPoint(IPAddress.Any, port));
}
public void Listen(int backlog)
{
_socket.Listen(backlog);
}
public void Accept()
{
_socket.BeginAccept(AcceptCallBack, null);
}
private void AcceptCallBack(IAsyncResult ar)
{
Socket clientSocket = _socket.EndAccept(ar);
Accept();
IPEndPoint clientEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
Console.WriteLine("Client Connected: {0}",clientEndPoint.Address.ToString());
_buffer = new byte[2048];
clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, clientSocket);
}
private void ReceivedCallback(IAsyncResult ar)
{
try
{
Socket clientSocket = ar.AsyncState as Socket;
int size = clientSocket.EndReceive(ar);
byte[] packet = new byte[size];
Array.Copy(_buffer, packet, packet.Length);
String data = System.Text.Encoding.ASCII.GetString(packet, 0, packet.Length);
}
catch (Exception ex)
{
;
}
}
}
}
先感谢您!
编辑:我想做的是像String commandReceived = socket.Receive()(就像你使用同步套接字),或通过该套接字接收该命令的某种方式 .
class DownloadServer
{
private static String UPDATEPATH="";
private static int FILEVERSION;
private static string ROOTPATH = "";
private String SQLUsername = "";
private String SQLPassword = "";
private String AccountDB = "";
private String ServerName = "";
private SqlConnection sqlConn;
//some logic methods
static void Main(string[] args){
ServerSecurity serverSecurity = new ServerSecurity();
ServerSocket serverSocket = new ServerSocket();
serv.Initialize();
serverSecurity.Initialize();
serverSocket.bind(15779);
serverSocket.Listen(1000);
serverSocket.Accept();
while (true)
{
Console.WriteLine("Input the command:");
var Input = Console.ReadLine();
if (Input == "Update")
{
serv.prepareUpdate();
}
else if (Input == "Exit")
{
Environment.Exit(0);
}
else if (Input == "TestEncryption")
{
Console.WriteLine("Enter the text to be encrypted:");
String plainText = Console.ReadLine();
Console.WriteLine("Original Text = {0}", plainText);
Console.WriteLine("Encrypted Text = {0}", serverSecurity.Encrypt(plainText));
Console.WriteLine("Decrypted Text = {0}", serverSecurity.Decrypt(serverSecurity.Encrypt(plainText)));
}
}
}
2 回答
添加您的DownloadServer类:
然后从这个NewSocket开始接收:
这看起来像是一个经典的设计问题,你试图给一个类太多的责任 . 在SOLID设计中,每个 class 都应该承担一项责任 . 然后,SocketServer将负责创建套接字和发送/接收数据 . 您的DownloadServer将负责创建要发送的数据 . 另一个类说ValidationServer,负责通过SocketServer请求数据并解析它 . 如果你愿意,第三类,一个控制器,将负责协调调用和在这些类之间传递数据 . 通过这种方式,您的SocketServer和DownloadServer将被解耦,并且不需要彼此的变量 .