有没有更好的方法来完成服务器客户端应用程序
本文关键字:服务器 客户端 应用程序 更好 方法 有没有 | 更新日期: 2023-09-27 18:20:47
我正在使用c#中的tcp套接字制作一个应用程序服务器客户端。。
该应用程序具有多个任务,如文件传输。。文件管理器。。闲聊(稍后语音聊天)
所以我决定创建一个套接字,以字符串形式接收命令和另一个用于传输文件的套接字
这是编写服务器客户端应用程序的好方法吗?还是应该尝试其他方法?因为用户可以在接收/发送文件时发送消息
以及我如何告诉(文件传输服务器)只接受已经与主服务器连接的同一客户端
例如:服务器侦听端口8000并接受客户端。。和端口8111 上的文件传输
public StartSever()
{
sr = new StreamReader(networkStream);
while(connected)
{
string[] command = sr.ReadLine().split(',');
switch (Command[0])
{
case "RecFile":
StartFileTransferServer(); // creating new socket tcp listens on port 8111
Receiving();
break;
case "SendFile":
StartFileTransferServer(); // creating new socket tcp listens on port 8111
Sending();
break;
case "Chat":
chat(Command[1]);
break;
default:
break;
}
}
您可以使用某种通信框架或库来抽象TCP/IP套接字的细节,并允许您在客户端和服务器端之间发送对象、消息和文件,而不必担心所有细节。
一些你可以考虑使用的东西:
- WCF
- ZeroMQ
- RabbitMQ
这些只是我脑海中想到的一些例子——有很多这样的框架在不同的抽象级别上工作,并提供更重或更轻的实现。我相信你能找到一个满足你基本需求的。
该应用程序具有多个任务,如文件传输。。文件管理器。。闲聊(稍后语音聊天)
如果您只需要使用冒号分隔的字符串协议和switch
语句,我建议您到此为止。
我强烈建议您将WCF与netTcpBinding和双工绑定一起使用:http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,b891610a-6b78-4b54-b9a6-4ec81c82b7c0.aspx
单独使用VoiceChat是不会成功的。为此购买一个组件。
当您调用Accept时,您将收到新用户的套接字。之后,您可以创建NetworkStream。写入和读取是阻塞方法。您可以尝试使用异步方法:BeginRead和BeginWrite。此外,如果你有数千个用户,那么为每个用户创建新线程是不好的。我提出这样的解决方案:一个线程Acpects连接并将工作发送到线程池。
类似的东西(注意这只是草案):
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleServer
{
class Program
{
private static void Worker(Object sockObj)
{
var mySocket = (Socket) sockObj;
using(var netStream = new NetworkStream(mySocket))
{
//Handle work;
}
}
static void Main(string[] args)
{
int port = 80;
// create the socket
Socket listenSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// bind the listening socket to the port
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
listenSocket.Bind(ep);
// start listening
listenSocket.Listen(125);
while (true)
{
Socket mySocket = listenSocket.Accept();
ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), mySocket);
}
}
}
}