21

Re: [Проблему вирішено] Виклик метода з іншої програми

...до чого сокети до консолi?

Command Line Parameters Tutorial (C#) https://msdn.microsoft.com/uk-ua/librar … 71%29.aspx

22

Re: [Проблему вирішено] Виклик метода з іншої програми

raxp написав:

...до чого сокети до консолi?

Command Line Parameters Tutorial (C#) https://msdn.microsoft.com/uk-ua/librar … 71%29.aspx

Ви не зрозумiли.
В мене посутi двi консолi але треба щоби одна з них виводила даннi в iншу.
А iнша могла отримувати команди вiд тої що вивидить.
Керування одною програмою через iншу

23

Re: [Проблему вирішено] Виклик метода з іншої програми

Не бачу ніяких проблем викликати з однієї програми (немає значення консольна вона, з гаєм чи або просто процес) - викликати іншу через параметри cmd line (немає значення консольна вона, з гаєм чи або просто процес).

Ось наприклад iз batch-файлу викликаю консольний midiout та передачею через cmd line параметрiв відтворення. Або ось виклик консольного синтезатора iз консолi з передачею через параметри того, що треба синтезувати. Що я роблю не так? )

24 Востаннє редагувалося Engineer (08.03.2016 23:41:23)

Re: [Проблему вирішено] Виклик метода з іншої програми

Я так зрозумів, що обидві програми повинні обмінюватися інформацією в процесі роботи, а не просто отримувати дані при запуску через командний рядок. Якщо це так, то ще раз повторюю - WCF в руки і буде вам щастя.
Як на мене, там усе просто і не треба заморочуватися з сокетами.

Просто почитати основи і подивитися приклади. Що не зрозуміло буде - мож запитати тут же, на форумі

Update Якщо немає бажання дивитися на WCF, то можна трохи зайнятися збоченнями і організувати взаємодію через звичайні файли або якусь базу даних :)

Подякували: Fox1

25

Re: [Проблему вирішено] Виклик метода з іншої програми

Ось як я зробив:
Сервер:

using ObooltNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Server
{
    class Program
    {
        static NetConnection client;
        static NetConnection net;
        static bool isLogin;
        static void Main(string[] args)
        {
            client = new NetConnection();
            client.OnConnect += server_OnConnect;
            client.OnDataReceived += server_OnDataReceived;
            client.OnDisconnect += server_OnDisconnect;

            client.Start(25565);

            while (true) ;
        }

        private static void server_OnDisconnect(object sender, NetConnection connection)
        {
            Console.WriteLine("Disconnect");
            isLogin = false;
        }

        private static void server_OnDataReceived(object sender, NetConnection connection, byte[] e)
        {
            OnCommand(Encoding.UTF8.GetString(e));
            net = connection;
        }

        private static void server_OnConnect(object sender, NetConnection connection)
        {
            Console.WriteLine("Connect");
            isLogin = false;
        }
        public static void OnCommand(string Command)
        {
            if (Command == "connect")
            {
                return;
            }
            try
            {
                Console.WriteLine("Mes: " + Command);
                if (Command.ToLower().StartsWith("login"))
                {
                    try
                    {
                        string[] arg = Command.Split(' ');
                        if (arg[1] == "12345")
                        {
                            SendMessages("You login.");
                            isLogin = true;
                        }
                        else 
                        {
                            Console.WriteLine("Error. Code: " + ErrorConteiner.Code_NoPASS);
                            SendMessages("Error. Code: " + ErrorConteiner.Code_NoPASS);
                        }
                    }
                    catch
                    {
                        Console.WriteLine("Error. Code: " + ErrorConteiner.Code_NoPASS);
                        SendMessages("Error. Code: " + ErrorConteiner.Code_NoPASS);
                    }
                }
                if (!isLogin)
                {
                    Console.WriteLine("Error. Code: " + ErrorConteiner.Code_NoLogin);
                    SendMessages("Error. Code: " + ErrorConteiner.Code_NoLogin);
                }
            }
            catch
            {
                Console.WriteLine("Error.");
            }
        }
        public static void SendMessages(string Command) 
        {
            byte[] data = Encoding.ASCII.GetBytes(Command);
            net.Send(data);
        }
    }
}

Клиент:

using ObooltNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            NetConnection client = new NetConnection();
            client.OnConnect += server_OnConnect;
            client.OnDataReceived += server_OnDataReceived;
            client.OnDisconnect += server_OnDisconnect;

            client.Connect("localhost", 25565);

            while (true) 
            {
                Console.Write(">");
                client.Send(Encoding.ASCII.GetBytes(Console.ReadLine()));
            }
        }

        private static void server_OnDisconnect(object sender, NetConnection connection)
        {
            Console.WriteLine("Disconnect");
        }

        private static void server_OnDataReceived(object sender, NetConnection connection, byte[] e)
        {
            Console.WriteLine(Encoding.UTF8.GetString(e));
        }

        private static void server_OnConnect(object sender, NetConnection connection)
        {
            Console.WriteLine("Connect");
            byte[] data = Encoding.ASCII.GetBytes("connect");
            connection.Send(data);
        }
    }
}

Це все через бiблiотеку ObooltNet.dll.
Ось ЇЇ код:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ObooltNet
{
    public class NetConnection
    {
        public delegate void NetConnectionEventHandler<TEventArgs>(object sender, NetConnection connection, TEventArgs e);
        public delegate void NetConnectionEventHandler(object sender, NetConnection connection);

        private TcpClient client;
        private TcpListener listener;
        private List<Task> tasks = new List<Task>();

        public event NetConnectionEventHandler OnConnect;
        public event NetConnectionEventHandler OnDisconnect;
        public event NetConnectionEventHandler<byte[]> OnDataReceived;

        public int BufferSize = 1024;
        public bool isClient = true;
        public bool isServer;

        public EndPoint RemoteEndPoint
        {
            get
            {
                if (client == null)
                    throw new InvalidOperationException("Client is not connected");
                return client.Client.RemoteEndPoint;
            }
        }

        public NetConnection()
        {

        }

        private NetConnection(TcpClient client)
        {
            this.client = client;
        }

        public void Connect(string hostname, int port)
        {
            CheckServerUsedAsClient();
            CheckClientAlreadyConnected();

            client = new TcpClient();
            client.Connect(hostname, port);

            CallOnConnect(this);

            StartReceiveFrom(this);
        }
        public void Connect(IPAddress address, int port)
        {
            CheckServerUsedAsClient();
            CheckClientAlreadyConnected();

            client = new TcpClient();
            client.Connect(address, port);

            CallOnConnect(this);

            StartReceiveFrom(this);
        }
        public void Disconnect()
        {
            CheckServerUsedAsClient();
            CallOnDisconnect(this);
            client.Close();
        }

        public void Start(int port)
        {
            Start(IPAddress.Any, port);
            isClient = false;
            isServer = true;
        }
        public void Start(IPAddress address, int port)
        {
            CheckClientUsedAsServer();
            CheckServerAlreadyStarted();

            listener = new TcpListener(address, port);
            listener.Start();

            StartListen();
        }
        public void Stop()
        {
            CheckClientUsedAsServer();
            listener.Stop();
            Task.WhenAll(tasks).Wait();
        }

        public void Send(byte[] data)
        {
            CheckServerUsedAsClient();
            client.GetStream().Write(data, 0, data.Length);
        }

        private void CallOnDataReceived(NetConnection connection, byte[] data)
        {
            if (OnDataReceived != null)
                OnDataReceived(this, connection, data);
        }
        private void CallOnConnect(NetConnection client)
        {
            if (OnConnect != null)
                OnConnect(this, client);
        }
        private void CallOnDisconnect(NetConnection client)
        {
            if (OnDisconnect != null)
                OnDisconnect(this, client);
        }

        private void CheckServerUsedAsClient()
        {
            if (listener != null)
                throw new InvalidOperationException("Cannot use a server connection as a client");
        }
        private void CheckClientUsedAsServer()
        {
            if (client != null)
                throw new InvalidOperationException("Cannot use a client connection as a server");
        }
        private void CheckServerAlreadyStarted()
        {
            if (listener != null)
                throw new InvalidOperationException("Server is already started");
        }
        private void CheckClientAlreadyConnected()
        {
            if (client != null)
                throw new InvalidOperationException("Client is already connected");
        }

        private void StartListen()
        {
            tasks.Add(ListenAsync());
        }
        private async Task ListenAsync()
        {
            while (true)
            {
                TcpClient client = await listener.AcceptTcpClientAsync();
                NetConnection connection = new NetConnection(client);
                StartReceiveFrom(connection);
                OnConnect(this, connection);
            }
        }

        private void StartReceiveFrom(NetConnection client)
        {
            tasks.Add(ReceiveFromAsync(client));
        }
        private async Task ReceiveFromAsync(NetConnection client)
        {
            try
            {
                NetworkStream stream = client.client.GetStream();
                byte[] buffer = new byte[BufferSize];
                MemoryStream ms = new MemoryStream();
                while (client.client.Connected)
                {
                    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
                    ms.Write(buffer, 0, bytesRead);
                    if (!stream.DataAvailable)
                    {
                        CallOnDataReceived(client, ms.ToArray());
                        ms.Seek(0, SeekOrigin.Begin);
                        ms.SetLength(0);
                    }
                }
                CallOnDisconnect(client);
            }
            catch
            {
                CallOnDisconnect(client);
                throw;
            }
        }
    }
}

Все вийшло навіть краще ніж я хотів.
Дуже дякую FakiNyan за iдею з сокетами.

Подякували: FakiNyan, leofun012

26

Re: [Проблему вирішено] Виклик метода з іншої програми

FakiNyan написав:

якщо проги пишуться з нуля, то я б використовував udp-сокети

Дуже дякую!!!
Ви найкращий :)