Клиент C # TCP подключается к серверу - PullRequest
0 голосов
/ 24 января 2019

Я работаю над сетевым отношением типа «ведущий - ведомый» между сервером и несколькими клиентами. С сервером все в порядке, проблема в том, что я новичок в TCP и не знаю, как подключиться к серверу, когда клиент не знает, с какого ip начинается.

Если бы кто-то мог переписать часть моего кода, чтобы он работал, я был бы благодарен.

Сервер

namespace Server
{
class Program
{
    static void Main(string[] args)
    {
        TcpListener listen = new TcpListener(IPAddress.Any, 8001);
        TcpClient clientSocket = default(TcpClient);
        int counter = 0;

        listen.Start();
        Console.WriteLine(" >> " + "Server Started");

        while (true)
        {
            counter += 1;
            clientSocket = listen.AcceptTcpClient();
            HandleClinet client = new HandleClinet();
            client.startClient(clientSocket, Convert.ToString(counter));
        }
    }
}

public class HandleClinet
{
    TcpClient clientSocket;
    string clNo;
    public void startClient(TcpClient inClientSocket, string clineNo)
    {
        clientSocket = inClientSocket;
        clNo = clineNo;
        Thread ClientThread = new Thread(DoChat);
        ClientThread.Start();
    }
    private void DoChat()
    {
        byte[] bytesFrom = new byte[1024];
        string dataFromClient = null;
        byte[] sendBytes = null;
        string serverResponse = null;

        while ((true))
        {
            try
            {
                NetworkStream networkStream = clientSocket.GetStream();

                networkStream.Read(bytesFrom, 0, 1024);
                dataFromClient = Encoding.ASCII.GetString(bytesFrom);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\0"));
                Console.WriteLine(" >> " + "From client-" + clNo + " " + dataFromClient);

                serverResponse = Console.ReadLine();
                sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                networkStream.Write(sendBytes, 0, sendBytes.Length);

                networkStream.Flush();
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}
}

Клиент

namespace Client
{
class Program
{
    public static TcpClient tcpclnt = new TcpClient();

    static void Main(string[] args)
    {
        while(true)
        {
            LoopConnect();
            LoopPacket();
            tcpclnt.Close();
        }
    }

    private static void LoopPacket()
    {
        byte[] bytesFrom = new byte[1024];
        string dataFromClient = null;
        byte[] sendBytes = null;
        string serverResponse = null;

        while ((true))
        {
            try
            {
                NetworkStream networkStream = tcpclnt.GetStream();

                serverResponse = "Give me a command!";
                sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                networkStream.Write(sendBytes, 0, sendBytes.Length);

                networkStream.Read(bytesFrom, 0, 1024);
                dataFromClient = Encoding.ASCII.GetString(bytesFrom);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\0"));
                Console.WriteLine(" >> " + "From server -" + dataFromClient);
                networkStream.Flush();
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }

    private static void LoopConnect()
    {
        Console.WriteLine("Connecting.....");
        while(true)
        {
            try
            {
                tcpclnt.Connect(IPAddress.Any, 8001); // The problem area
                break;
            }
            catch (Exception)
            {
                Console.Write(".");
            }
        }
        Console.WriteLine("Connected.");
    }
}
}

1 Ответ

0 голосов
/ 24 января 2019

Клиент должен как-то получить адрес сервера. Способ зависит от типа сети (локальная или интернет). В случае с Интернетом это практически невозможно без какого-либо известного сверстника. В случае локальной сети вы можете использовать широковещательный UDP-запрос (этот метод зависит от правил маршрутизации локальной сети).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...