不断运行的服务器
|
当客户端断开连接时,服务器关闭。告诉我在第一次会议结束后如何保持联系新客户的能力。谢谢。
namespace tcpserver
{
class Program
{
static void Main(string[] args)
{
string cmd;
int port = 56568;
Server Serv = new Server(); // Создаем новый экземпляр класса
// сервера
Serv.Create(port);
while (true)
{
cmd = Console.ReadLine(); // Ждем фразы EXIT когда
// понадобится выйти из приложения.
// типа интерактивность.
if (cmd == \"EXIT\")
{
Serv.Close(); // раз выход – значит выход. Серв-нах.
return;
}
}
//while (Serv.Close() == true) { Serv.Create(port); }
}
public class Server // класс сервера.
{
private int LocalPort;
private Thread ServThread; // экземпляр потока
TcpListener Listener; // листенер))))
public void Create(int port)
{
LocalPort = port;
ServThread = new Thread(new ThreadStart(ServStart));
ServThread.Start(); // запустили поток. Стартовая функция –
// ServStart, как видно выше
}
public void Close() // Закрыть серв?
{
Listener.Stop();
ServThread.Abort();
return;
}
private void ServStart()
{
Socket ClientSock; // сокет для обмена данными.
string data;
byte[] cldata = new byte[1024]; // буфер данных
Listener = new TcpListener(LocalPort);
Listener.Start(); // начали слушать
Console.WriteLine(\"Waiting connections on \" + Convert.ToString(LocalPort) + \" port\");
try
{
ClientSock = Listener.AcceptSocket(); // пробуем принять клиента
}
catch
{
ServThread.Abort(); // нет – жаль(
return;
}
int i = 0;
if (ClientSock.Connected)
{
while (true)
{
try
{
i = ClientSock.Receive(cldata); // попытка чтения
// данных
}
catch
{
}
try
{
if (i > 0)
{
data = Encoding.ASCII.GetString(cldata).Trim();
Console.WriteLine(\"<\" + data);
if (data == \"CLOSE\") // если CLOSE –
// вырубимся
{
ClientSock.Send(Encoding.ASCII.GetBytes(\"Closing the server...\"));
ClientSock.Close();
Listener.Stop();
Console.WriteLine(\"Server closed. Reason: client wish! Type EXIT to quit the application.\");
ServThread.Abort();
return;
}
else
{ // нет – шлем данные взад.
ClientSock.Send(Encoding.ASCII.GetBytes(\"Your data: \" + data));
}
}
}
catch
{
ClientSock.Close(); //
Listener.Stop();
Console.WriteLine(\"Client disconnected. Server closed.\");
ServThread.Abort();
}
}
}
}
}
}
}
没有找到相关结果
已邀请:
2 个回复
抽法
重要的一点是创建套接字,将其绑定到地址,并且ѭ2outside都在循环外部处理,
和起始线程在循环内部。 您可能需要将整个块包装在另一个线程中;那是可以接受的。重要的部分是将
与
和每个客户端
分开。这使您的代码可以停止接受新连接,但处理现有客户端,直到它们断开连接,或者在它们使用资源分配但继续接受连接时断开现有连接,等等。(请注意,如果有任何单个客户端,最后的
块将如何终止服务器套接字会引发异常;使用通常的服务器布局很容易避免此类代码。)
旗低饶彤
用continue代替,这不会中断while循环,但会停止当前的“回合”。请考虑阅读以下内容:http://www.codeproject.com/KB/IP/serversocket.aspx从中构建的好项目