#c# #multithreading #sockets
#c# #многопоточность #сокеты
Вопрос:
В настоящее время я программирую на C #, я хотел бы изменить приведенный ниже код, чтобы изолировать одно клиентское соединение. так же, как создание комнаты для отдыха из основного пула.
Ниже приведены 2 файла, один из которых представляет собой просто базовый стандартный файл Program.cs консольного приложения .NET Framework; другой — файл сервера. В сочетании они оба могут создать многопоточный сервер, но мне бы хотелось, чтобы он также позволял мне выбирать клиента для подключения на случай, если я создам приложение удаленного управления, как это сделал мой друг.
В качестве примечания я хотел бы поделиться тем, что я хочу иметь возможность подключаться к клиенту, войдя connect [1,2,3,etc..]
в консоль.
Ответы
Если вы ответите, пожалуйста, добавьте какой-нибудь код, это действительно, действительно поможет. Я учусь намного лучше, просматривая код, а не читая документацию.
Код
Server.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace TCPServer
{
class Server
{
TcpListener server = null;
int counter = 0;
public Server(string ip, int port)
{
IPAddress localAddr = IPAddress.Parse(ip);
server = new TcpListener(localAddr, port);
server.Start();
StartListener();
}
public void StartListener()
{
try
{
while (true)
{
Console.WriteLine("Waiting for incoming connections...");
TcpClient client = server.AcceptTcpClient();
counter = 1;
Console.WriteLine("Connected to authorized client: {0}", counter);
Thread t = new Thread(new ParameterizedThreadStart(HandleDeivce));
t.Start(client);
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
server.Stop();
}
}
public void HandleDeivce(Object obj)
{
TcpClient client = (TcpClient)obj;
var stream = client.GetStream();
string imei = String.Empty;
string data = null;
Byte[] bytes = new Byte[256];
int i;
try
{
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
string hex = BitConverter.ToString(bytes);
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("{1}: Received: {0}", data, Thread.CurrentThread.ManagedThreadId);
if (data != "auth token")
{
stream.Close();
client.Close();
}
string str = "Device authorization successfull";
Byte[] reply = System.Text.Encoding.ASCII.GetBytes(str);
stream.Write(reply, 0, reply.Length);
Console.WriteLine("{1}: Sent: {0}", str, Thread.CurrentThread.ManagedThreadId);
}
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e.ToString());
client.Close();
}
}
}
}
Program.cs
using System;
using System.Threading;
namespace TCPServer
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(delegate()
{
Server server = new Server("127.0.0.1", 13000);
});
thread.Start();
Console.WriteLine("Server started...");
}
}
}
Комментарии:
1. Клиент / сервер имеет два значения в зависимости от того, находятся ли они на прикладном уровне или на уровне сокетов. Вы используете TCP, который является уровнем сокетов. С помощью TCL сначала должен быть запущен сервер (прослушиватель), а затем вы подключаете клиент к прослушивателю. В Net прослушиватель автоматически настраивается так, чтобы разрешить подключение нескольких клиентов. На прикладном уровне у вас может быть двухпортовый сервер, где один порт является слушателем, а другой — клиентом.
2. хорошо, как бы мне это реализовать? Я вроде как новичок в программировании сокетов на C #, однако, когда дело доходит до Python3 и Java, я в порядке.
3. Ваш IP-адрес клиента представляет собой строку, чтобы просто изменить строку на другой IP: сервер (строка ip, порт int). Вы опубликовали только код прослушивателя TCP, а не клиент.
4. Я понимаю это, но часть о размещении на 2 разных портах? я бы просто создал 2 экземпляра сервера, но с разными портами?
5. Это будет работать. Но обычно у вас будет один клиент и один сервер. Предположим, у вас есть служба, которая принимает запросы клиентов к базе данных. Вы должны запустить службу, открыв клиент для базы данных. Затем начните прослушивать запросы клиентов, подключающихся и обрабатывающих запросы.