Re: [Проблему вирішено] Виклик метода з іншої програми
...до чого сокети до консолi?
Command Line Parameters Tutorial (C#) https://msdn.microsoft.com/uk-ua/librar … 71%29.aspx
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C#, .NET → [Проблему вирішено] Виклик метода з іншої програми
Для відправлення відповіді ви повинні увійти або зареєструватися
...до чого сокети до консолi?
Command Line Parameters Tutorial (C#) https://msdn.microsoft.com/uk-ua/librar … 71%29.aspx
...до чого сокети до консол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ншу
Не бачу ніяких проблем викликати з однієї програми (немає значення консольна вона, з гаєм чи або просто процес) - викликати іншу через параметри cmd line (немає значення консольна вона, з гаєм чи або просто процес).
Ось наприклад iз batch-файлу викликаю консольний midiout та передачею через cmd line параметрiв відтворення. Або ось виклик консольного синтезатора iз консолi з передачею через параметри того, що треба синтезувати. Що я роблю не так? )
Я так зрозумів, що обидві програми повинні обмінюватися інформацією в процесі роботи, а не просто отримувати дані при запуску через командний рядок. Якщо це так, то ще раз повторюю - WCF в руки і буде вам щастя.
Як на мене, там усе просто і не треба заморочуватися з сокетами.
Просто почитати основи і подивитися приклади. Що не зрозуміло буде - мож запитати тут же, на форумі
Update Якщо немає бажання дивитися на WCF, то можна трохи зайнятися збоченнями і організувати взаємодію через звичайні файли або якусь базу даних
Ось як я зробив:
Сервер:
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дею з сокетами.
якщо проги пишуться з нуля, то я б використовував udp-сокети
Дуже дякую!!!
Ви найкращий
Для відправлення відповіді ви повинні увійти або зареєструватися