我正在使用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;
}
}
答案 0 :(得分:1)
您可以使用某种通信框架或库来抽象TCP / IP套接字的细节,并允许您在客户端和服务器端之间发送对象,消息和文件,而不必担心所有细节。< / p>
您可以使用相反的一些事情:
这些只是我想到的一些例子,有很多这样的框架可以在不同的抽象层次上工作,并提供更重或更轻的实现。我相信你能找到一款满足你基本需求的产品。
答案 1 :(得分:1)
应用程序有多个任务,如文件传输..文件管理器..聊天..(稍后语音聊天)
如果你没有比使用冒号分隔的字符串协议和switch
语句更长的时间,我建议你停在那里。
我强烈建议您将WCF与netTcpBinding和双工绑定结合使用:http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,b891610a-6b78-4b54-b9a6-4ec81c82b7c0.aspx
您自己的VoiceChat不会成功。为此购买一个组件。
答案 2 :(得分:0)
当您致电接受时,您会收到新用户的套接字。在此之后,您可以创建NetworkStream。 Write和Read是阻塞方法。您可以尝试使用异步方法:BeginRead和BeginWrite。 如果您有数千名用户,那么每个用户创建新线程也不好。 我建议这样的解决方案:一个线程认为连接并将工作发送到线程池。
像这样的东西(注意这只是草稿):
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);
}
}
}
}