Передача объектов по трубам~/topic/3923/peredacha-obektov-po-trubam/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T22:22:27Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/posts/m/27237/ А как это тогда стандартизировать под один объём? Никак. Разные данные имеют разные длины. Нужно по...2013-08-30T06:30:09Z2013-08-30T06:30:09ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ru<div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27234/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27233/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />А как это тогда стандартизировать под один объём?</div></div><br /><br />Никак. Разные данные имеют разные длины. Нужно посылать вначале ввиде 2-3-ех байт размер сообщения, а дальше уже само сообщение. Чтобы принимающая сторона знала, сколько ей считывать.</div></div><br /><br />По идее такая конструкция должна считывать всё посланное сообщение целиком.<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
byte[] buffer = new byte[1024];
while(pipeServer.Read(buffer, 0, buffer.Length) != 0);
</pre>
</div></div><br /><br />По крайней мере у меня заполненным оказывается весь килобайт, полезной информации которой составляет на самом деле треть. После этого он мне выкидывает экцепцию "Не удалось найти сборку". Даже с учётом того, что структуру я вынес в отдельную библиотеку, правда так до сих пор не понятно зачем это нужно, ведь она была прописана внутри класса, скопипастена с входящего конца трубы.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27234/ А как это тогда стандартизировать под один объём? Никак. Разные данные имеют разные длины. Нужно по...2013-08-29T18:50:03Z2013-08-29T18:50:03ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27233/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />А как это тогда стандартизировать под один объём?</div></div><br /><br />Никак. Разные данные имеют разные длины. Нужно посылать вначале ввиде 2-3-ех байт размер сообщения, а дальше уже само сообщение. Чтобы принимающая сторона знала, сколько ей считывать.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27233/ // здесь длина буфера = 65к byte buffer = new byte; // а тут длина буфера будет уже равна исходя из...2013-08-29T18:13:26Z2013-08-29T18:13:55ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ru<div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27228/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27178/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
// здесь длина буфера = 65к
byte[] buffer = new byte[65000];
// а тут длина буфера будет уже равна исходя из длина stream, тоесть клиент отправляет на сервер не 65к
buffer = Encoding.UTF8.GetBytes(Convert.ToString(stream));
// тут сервер выделил статичечки 65к
byte[] buffer = new byte[65000];
// и ждет что придет 65к, но на самом деле может прийти и меньше и больше, так как клиент отправляет не 65к
pipeStream.Read(buffer, 0, buffer.Length);
</pre>
</div></div></div></div></div></div><br /><br />А как это тогда стандартизировать под один объём?<br /><br />Посылаю текстовые сообщения из одного приложения в другое - нормально. Стоит заменить на структуру или класс и всё, то нарушен канал, то <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAA2ekziqpglRxbXK4EiWaFCj15CYquX_8lm8rVB_EHiEDyTaOFdZ5iZ8RL-SAoX-oDqVwY4Rgz580LhMDg3mdcwLuX8FplRZHsehDVX6Dv74Qp_5TIhNpKOm4RFHLdWy80" title="http://social.msdn.microsoft.com/Forums/ru-RU/85053abb-50e2-4181-9cf7-76ffb6a4ecd9/-">не удаётся десереализировать</a>.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27228/ // здесь длина буфера = 65к byte buffer = new byte; // а тут длина буфера будет уже равна исходя из...2013-08-29T13:04:36Z2013-08-29T13:04:36ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27178/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
// здесь длина буфера = 65к
byte[] buffer = new byte[65000];
// а тут длина буфера будет уже равна исходя из длина stream, тоесть клиент отправляет на сервер не 65к
buffer = Encoding.UTF8.GetBytes(Convert.ToString(stream));
// тут сервер выделил статичечки 65к
byte[] buffer = new byte[65000];
// и ждет что придет 65к, но на самом деле может прийти и меньше и больше, так как клиент отправляет не 65к
pipeStream.Read(buffer, 0, buffer.Length);
</pre>
</div></div></div></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27224/В место Encoding.UTF8.GetBytes(Convert.ToString(stream)); лучше использовать stream.ToArray(); И пре...2013-08-29T10:55:58Z2013-08-29T12:41:05ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ru<div class="quote"><span class="quotetitle">IvanB <a href="https://stocksharp.ru/posts/m/27217/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">В место<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
Encoding.UTF8.GetBytes(Convert.ToString(stream));</pre>
</div></div><br />лучше использовать<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
stream.ToArray();</pre>
</div></div><br /><br />И предлагаю посмотреть на решение по сеирализации\десериализации предложенное на форуме: <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADaUgqeUiMvqHjAqLN3xr_cYQ12WhxUIL45Q--L0kVVWtcmgWKW9jAAPdSEyC7FjrKIt7k5rs1JjjWvbr2Mxg4sQ13nwvA3Z22xqjMGswRu2gYmAJ5Qff-kW6MLaLd7hexcKGGfEnvvlwwJDjHFJa6O" title="http://stackoverflow.com/questions/4021893/saving-a-dictionarystring-int32-in-c-sharp-serialization">http://stackoverflow.com...in-c-sharp-serialization</a></div></div><br /><br />В <a target="_blank" href="http://msdn.microsoft.com/ru-ru/library/system.io.binarywriter.aspx" title="http://msdn.microsoft.com/ru-ru/library/system.io.binarywriter.aspx">MSDN</a> говорят, что класс BinaryWriter работает только с простыми типами данных, а такой как словарь, наверное, сложный.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27217/В место Encoding.UTF8.GetBytes(Convert.ToString(stream)); лучше использовать stream.ToArray(); И пре...2013-08-29T07:50:53Z2013-08-29T07:50:53ZIvanBhttps://stocksharp.ru/users/26984/info@stocksharp.ruВ место<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
Encoding.UTF8.GetBytes(Convert.ToString(stream));</pre>
</div></div><br />лучше использовать<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
stream.ToArray();</pre>
</div></div><br /><br />И предлагаю посмотреть на решение по сеирализации\десериализации предложенное на форуме: <a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAADaUgqeUiMvqHjAqLN3xr_cYQ12WhxUIL45Q--L0kVVWtcmgWKW9jAAPdSEyC7FjrKIt7k5rs1JjjWvbr2Mxg4sQ13nwvA3Z22xqjMGswRu2gYmAJ5Qff-kW6MLaLd7hexcKGGfEnvvlwwJDjHFJa6O" title="http://stackoverflow.com/questions/4021893/saving-a-dictionarystring-int32-in-c-sharp-serialization">http://stackoverflow.com...in-c-sharp-serialization</a>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27178/Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все...2013-08-27T16:50:43Z2013-08-27T16:50:43ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ru<div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27149/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27147/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27139/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все что угодно. Это называется сериализация. Наши классы (из BisEnt) поддерживают WCF сериализацию.</div></div><br /><br />Да-да, вот как раз пытался сериализовать и в бинарник, и в XML. Но даже не вижу на какой стороне проблема, сервера или клиента. Если есть под рукой пример, скиньте, пожалуйста.</div></div><br /><br />Под рукой простого примера нет. А в чем выражается проблема? Попробуйте вначале делать сериализацию-десериализацию локально, без пайпов. Чтобы проверить, что она правильно происходит. А потом уже пайпы. Сложное - это всегда передача состояния. Сам трансфер данных - прост до безобразия. Пайпы - это не сокеты. Тут ни датаграм, ни пакетов. Все передается как есть.</div></div><br /><br />C сериализацией уже экспериментировал, сохранял и загружал из файлов.<br /><br />Переделал такой консольный пример. В методе Main закоментены вызовы первой пары методов, которые успешно передают и получают текстовые сообщение. Проблема со второй парой. Сервер не принимает заполненный словарь, формат не разберёт.<br /><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Pipes;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
namespace PipeApplication1
{
class ProgramPipeTest
{
public void ThreadStartServer()
{
// Create a name pipe
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe2"))
{
Console.WriteLine("[Server] Pipe created {0}", pipeStream.GetHashCode());
// Wait for a connection
pipeStream.WaitForConnection();
Console.WriteLine("[Server] Pipe connection established");
using (StreamReader sr = new StreamReader(pipeStream))
{
string temp;
// We read a line from the pipe and print it together with the current time
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("{0}: {1}", DateTime.Now, temp);
}
}
}
Console.WriteLine("Connection lost");
}
public void ThreadStartClient(object obj)
{
// Ensure that we only start the client after the server has created the pipe
ManualResetEvent SyncClientServer = (ManualResetEvent)obj;
// Only continue after the server was created -- otherwise we just fail badly
// SyncClientServer.WaitOne();
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("mytestpipe2"))
{
// The connect function will indefinately wait for the pipe to become available
// If that is not acceptable specify a maximum waiting time (in ms)
pipeStream.Connect();
Console.WriteLine("[Client] Pipe connection established");
using (StreamWriter sw = new StreamWriter(pipeStream))
{
sw.AutoFlush = true;
string temp;
Console.WriteLine("Please type a message and press [Enter], or type 'quit' to exit the program");
while ((temp = Console.ReadLine()) != null)
{
if (temp == "quit") break;
sw.WriteLine(temp);
}
}
}
}
public void BinServer()
{
BinaryFormatter binFormat = new BinaryFormatter();
// Create a name pipe
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe1"))
{
Console.WriteLine("[Server] Pipe created {0}", pipeStream.GetHashCode());
// Wait for a connection
pipeStream.WaitForConnection();
Console.WriteLine("[Server] Pipe connection established");
byte[] buffer = new byte[65000];
pipeStream.Read(buffer, 0, buffer.Length);
var stream = new MemoryStream(buffer);
var obj = (Dictionary<int, string>)binFormat.Deserialize(stream);
Console.WriteLine(obj);
}
}
public void BinClient(object obj)
{
var dic = new Dictionary<int, string> {{11, "hello"}, {22, "world"}};
BinaryFormatter binFormat = new BinaryFormatter();
var stream = new MemoryStream();
binFormat.Serialize(stream, dic);
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("mytestpipe1"))
{
pipeStream.Connect();
Console.WriteLine("[Client] Pipe connection established");
byte[] buffer = new byte[65000];
buffer = Encoding.UTF8.GetBytes(Convert.ToString(stream));
pipeStream.Write(buffer,0,buffer.Length);
}
}
static void Main(string[] args)
{
// To simplify debugging we are going to create just one process, and have two tasks
// talk to each other. (Which is a bit like me sending an e-mail to my co-workers)
ProgramPipeTest Server = new ProgramPipeTest();
ProgramPipeTest Client = new ProgramPipeTest();
//Thread ServerThread = new Thread(Server.ThreadStartServer);
//Thread ClientThread = new Thread(Client.ThreadStartClient);
Thread ServerThread = new Thread(Server.BinServer);
Thread ClientThread = new Thread(Client.BinClient);
ServerThread.Start();
ClientThread.Start();
}
}
}
</pre>
</div></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27149/Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все...2013-08-26T15:53:06Z2013-08-26T15:53:06ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">Buratino <a href="https://stocksharp.ru/posts/m/27147/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27139/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все что угодно. Это называется сериализация. Наши классы (из BisEnt) поддерживают WCF сериализацию.</div></div><br /><br />Да-да, вот как раз пытался сериализовать и в бинарник, и в XML. Но даже не вижу на какой стороне проблема, сервера или клиента. Если есть под рукой пример, скиньте, пожалуйста.</div></div><br /><br />Под рукой простого примера нет. А в чем выражается проблема? Попробуйте вначале делать сериализацию-десериализацию локально, без пайпов. Чтобы проверить, что она правильно происходит. А потом уже пайпы. Сложное - это всегда передача состояния. Сам трансфер данных - прост до безобразия. Пайпы - это не сокеты. Тут ни датаграм, ни пакетов. Все передается как есть.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27147/Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все...2013-08-26T13:58:39Z2013-08-26T13:58:39ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ru<div class="quote"><span class="quotetitle">Михаил Сухов <a href="https://stocksharp.ru/posts/m/27139/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все что угодно. Это называется сериализация. Наши классы (из BisEnt) поддерживают WCF сериализацию.</div></div><br /><br />Да-да, вот как раз пытался сериализовать и в бинарник, и в XML. Но даже не вижу на какой стороне проблема, сервера или клиента. Если есть под рукой пример, скиньте, пожалуйста.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27139/Через сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все...2013-08-26T08:42:40Z2013-08-26T08:42:40ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ruЧерез сетевое соединение передаются только байты, не стринги и не числа. В байты можно перевести все что угодно. Это называется сериализация. Наши классы (из BisEnt) поддерживают WCF сериализацию.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/27136/Можно ли передавать через именованные каналы объекты, а не только стринговые сообщения? Ни в одном н...2013-08-26T07:35:56Z2013-08-26T07:35:56ZBuratinohttps://stocksharp.ru/users/451/info@stocksharp.ruМожно ли передавать через именованные каналы объекты, а не только стринговые сообщения? Ни в одном найденном мной примере про <a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx" title="http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx">NamedPipes</a> не нашёл передачу чего-либо кроме текста.Copyright @ StockSharp Platform LLC 2010 - 2024