Создание TCP/IP сервера на C#

C# предлагает много библиотек для управления соединениями, как на стороне сервера, так и клиента. В данной статье рассмотрим создания простого сервера шаг за шагом, от простого к сложному.

Прежде чем мы начнем

     Эта статья покажет как создать маленький TCP-сервер который передает простое сообщение к каждому подсоединённому клиенту. Первые два примера используют синхронный ввод/вывод, последний использует асинхронное соединение. Каждая из следующих программ будет делать:

  1. Настройка TCP стека
  2. Прослушивание входящих TCP соединений (localhost, порт 2200)
  3. Принятие соединения
  4. Отображение IP адреса вызывающего, и порт удаленной системы
  5. Посылка сообщения “Я немного занят, приходите попозже”
  6. Закрытие соединения
  7. Повторяем с пункта 2

Какие бывают IP адреса?

     Каждому компьютеру в TCP сети присваивается сетевой адрес, который в общем виде выглядит так х.х.х.х (10.0.0.6). Конечно же, это IPv4, IPv6 оставим на другой раз. Если компьютер имеет больше одной сетевой карты, тогда может быть больше одного адреса. Кроме того, есть еще два важных адреса: • 0.0.0.0 – если Вы установите его, как исходный адрес, ваша программа будет прослушивать все сетевые карты компьютера. • 127.0.0.1 – это локальный адрес. Любая программа которая привязывает себя к этому адресу, будет доступна только на этом же компьютере. Чтобы несколько программ могли использовать сетевой интерфейс, каждая может прослушивать один 16 битный порт (0 – 65536, 0 – 1024 обычно зарезервированы системными службами). Для нашего небольшого сервера мы случайно выбрали порт 2200. Это возможно для программ которые привязывают себя только к одной сетевой карте (например, web сервер будет доступен только через внешний интерфейс) или все одновременно. В нашем примере мы привяжемся к адресу 127.0.0.1. В результате «сервер» будет доступен программе только на этом же компьютере.

Версия 1 – TcpListener

     Чтобы избежать углубления в TCP стек, классы System.Net.Sockets.TcpClient и System.Net.Sockets.TcpListener помогут нам отправлять и принимать данные по сети. Также это возможно через объект NetworkStream.

  • TcpListener позволит нам прослушивать входящие соединения
  • TcpClient обрабатывать соединение
  •  NetworkStream посылать и принимать данные
static void Main(string[] args)
{
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] message = encoding.GetBytes("Я немножко занят, приходите попозже");

try
{
IPAddress localAddress = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(localAddress,2200);

listener.Start(1);

while (true)
{
Console.WriteLine("Сервер ожидает {0}", listener.LocalEndpoint);
TcpClient client = listener.AcceptTcpClient();
NetworkStream io = client.GetStream();

Console.WriteLine("Принято соединение от {0}", client.Client.RemoteEndPoint);

Console.WriteLine("Отправляем сообщение...");
io.Write(message,0,message.Length);

Console.WriteLine("Закрытие соединения");
client.Close();
}
}
catch (Exception e)
{
Console.WriteLine("Произошла ошибка {0}", e.Message);
}
}

      Мы создали синхронное соединение – нам необходимо дождаться подключения чтобы программа смогла продолжить работу.Запустите telnet (из командной строки) и подсоединимся к нашему серверу. Продолжим выполнение программы, как только подсоединимся. telnet localhost 2200 Окно Telnet покажет нам сообщение переданное сервером.


 Версия 2 – Использование сокетов для соединения


     Теперь давайте рассмотри на примере сокетов. В следующем нашем примере мы оставим эти два класса, вместо них будем использовать класс System.Net.Sockets.Socket.На самом деле разница заключается в настройке соединения:

Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

     Первый параметр задает схему адресации, мы выбрали InterNetwork это IPv4. Так же есть и схемы: AppleTalk, ATM, Banyan, Chaos, DataKit, DecNet, Iso, Osi и многие другие. ProtocolType указывает тот протокол, который используется, я выбрал TCP.

// Привязываемся к нашему IP адресу
IPAddress localAddress = IPAddress.Parse("127.0.0.1");

// Инициализируем новый экземпляр IPEndPoint(узел) с IP адресом и портом
IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);

// Делаем привязку к IPEndPoint
listenSocket.Bind(ipEndpoint);

//Начинаем слушать, указываем что только 1 соединение может быть в одно время
listenSocket.Listen(1);
Так же как и в случае с TCPListener нам необходимо прослушивать 127.0.0.1:2200. Полный код программы:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SimpleServerUsingSockets
{
class Program
{
public static void Main()
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

try
{
IPAddress localAddress = IPAddress.Parse("127.0.0.1");

Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);

listenSocket.Bind(ipEndpoint);

listenSocket.Listen(1);

// Начинаем ждать соединение – бесконечный цикл
while (true)
{
Console.WriteLine("Сервер ожидает {0}", ipEndpoint);

// Программа приостановлена. Ожидаем входящего соединения
// Это синхронное TCP приложение
Socket handler = listenSocket.Accept();

//Входящее соединение необходимо обработать
Console.WriteLine("Принято соединение от {0}", handler.RemoteEndPoint);

Console.WriteLine("Отправляем сообщениею..");
handler.Send(encoding.GetBytes("Я занят"));

// Соединение необходимо закрыть
Console.WriteLine("Закрытие соединение");
handler.Close();
}

}
catch (Exception e)
{
Console.WriteLine("Произошла ошибка: {0}", e.ToString());
}
}
}
}

Версия 3 – Теперь ассинхронный


     В двух предыдущих примерах использовался синхронный ввод-вывод. Нам необходимо ждать пока удаленная система подсоединится, тогда программа продолжит работу. Конечно, в реальной жизни хотелось, чтобы наш сервер был лучше. Для этого нам необходимо использовать асинхронный ввод-вывод. Вся сложная работа сделана за Вас в методах BeginAccept и EndAccept. При вызове метода BeginAccept необходимо указать функцию обратной связи, т.е мы должны сослаться на метод, который должен вызываться при завершении соответствующей асинхронной операции. Этот метод обратного вызова реализует делегат AsyncCallback, выполняется в отдельном потоке и вызывается системой после возврата значения методом BeginAccept. В теле функции обратной связи нам необходимо вызвать EndAcceptдля связи с удаленным узлом.

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace SimpleServer
{
class Program
{
public static void ReceiveCallback(IAsyncResult AsyncCall)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] message = encoding.GetBytes("Я занят");

Socket listener = (Socket)AsyncCall.AsyncState;
Socket client = listener.EndAccept(AsyncCall);

Console.WriteLine("Принято соединение от: {0}", client.RemoteEndPoint);
client.Send(message);

Console.WriteLine("Закрытие соединения");
client.Close();

// После того как завершили соединение, говорим ОС что мы готовы принять новое
listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener);
}

public static void Main()
{
try
{

IPAddress localAddress = IPAddress.Parse("127.0.0.1");

Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);

listenSocket.Bind(ipEndpoint);

listenSocket.Listen(1);
listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket);
Console.WriteLine("Ожидание соединения… {0}", listenSocket.LocalEndPoint);

while (true)
{

Console.WriteLine("Занят....");
Thread.Sleep(2000);
}

}
catch (Exception e)
{
Console.WriteLine("Произошла ошибка: {0}", e.ToString());
}
}
}
}

25

  1. Artyom Krivokrisenko комментирует...:

    На самом деле принятие подключения делать асинхронным не обязательно. Достаточно запустить цикл в отдельном потоке (как делалось в первом примере). Хотя если нужно принимать подключения на большом количестве портов, то и прием подключений нужно будет делать асинхронно

    Что же надо делать асинхронно в любом слуае - так это отправку и прием данных.

    ReceiveCallback будет выполняться в ThreadPool, таким образом для каждого клиента будет выделяться по одному потоку в пуле потоков (количество которых, как известно, ограничено). Чем больше активных клиентов, тем больше потоков, и в определенный момент свободные поткои в пуле кончатся, а новые среда запускать уже не будет из-за ограничения, клиент станет в очередь, и следующий клиент приниматься не будет, пока не закроется одно из существующих подключений.

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

    Поэтому сам обмен данными с клиентом делается через BeginRead/BeginWrite (если работа идет с NetworkStream), или соответствующими методами сокета. Время обработки полученых данных в ThreadPool по возможности минимизировать, чтоб не допускать полного заполнения пула, если это не удается, то можно запустить нужное количество рабочих потоков, и отправлять сообщения на обработку им в очередь.

    Это касается настоящего TCP-сервера на C#, который поддерживает подключение с клиентами и постоянно с ними общается. В приведеном примере такая проблема не возникнет, потому что все подключеныне клиенты почти сразу закрываются, и добиться заполнения пула потоков будет почти невозможно.

  1. sharok комментирует...:

    Спасибо за дополнение.

  1. Unknown комментирует...:

    А можно уточнить про пул коннектов? какой его размер и есть ли возможность увеличивать/уменьшать или указывать лимит?

  1. sharok комментирует...:

    Для увеличения или уменьшения можно использовать методы ThreadPool.SetMaxThreads или ThreadPool.SetMinThreads. Лимит вроде 25, но есть статьи как это ограничение обойти.

  1. Unknown комментирует...:

    а можно плз ссылочки на эти статьи? :)
    Кстати на Ява делают сервера приложений... а на C# получается не получится сделать из-за лимита? :(
    За что так майкрософт? :(

  1. sharok комментирует...:

    Anton: http://www.codeguru.com/csharp/csharp/cs_syntax/threading/article.php/c5847
    http://www.codeproject.com/KB/threads/threadtests.aspx

  1. Unknown комментирует...:

    сенкс :) почитаю... нужно разбираться, с хочу не очень понятно :)

  1. Анонимный комментирует...:

    А можно увидеть реализацию сервера с постоянными подключениями на несколько клиентов с сокетами висящими на одном порте в синхронном режиме сокетов(запрос-ответ)?(каждый клиент отвечает на команду от сервера с периодом отправки команды ~300 мс)

  1. Анонимный комментирует...:

    А есть исходник клиента для 3 версии? очень хочу сделать многопользовательский чат... но ничего не выходит :(

  1. Анонимный комментирует...:

    Привет всем. Огромное спасибо за данный топик.

  1. Unknown комментирует...:

    спасибо за топик!

    твою ж мать!! а еще С-шники делфи недоязыком кличут там и клиент и сервер на сокетах в 4 строки кода укладывается!!

  1. Анонимный комментирует...:

    Подскажите как подключиться удаленно ? Свой IP вписать нужно ?

  1. Unknown комментирует...:

    Абсолютно согласен с папкой ВоТ) Действительно на Делфи дело проще обстоит.

  1. Анонимный комментирует...:

    Последний пример "обрабатывает" только одно подключение, как его перекодить чтобы например сервер отправил отправил сообщение от второго клиента первому, аа?

  1. Анонимный комментирует...:

    и нифига оно не асинхнонное - пока не обработает один запрос, следующий клиент не сможет подключится

  1. Анонимный комментирует...:

    Cпасибо) очень пригодиться а то на MSND такой заумный код.....

  1. Дмитрий комментирует...:

    Это не совсем относится к теме, но глаза мозолит.
    В 1 строке main'а создаете экземпляр ASCIIEncoding непосредственным вызовом конструктора. Не рекомендуется так делать, это создает новый объект в куче, что негативно сказывается на производительности, не давая никаких дополнительных плюсов (как это могло бы быть, используй вы конструкторы с параметрами UTF8Encoding, либо другого наследника Encoding). Дла ASCII следует использовать свойство Encoding.ASCII и только его.

  1. Анонимный комментирует...:

    а можете пожалуйста бросить рарник данной программы чтобы можно было запустить?

  1. Анонимный комментирует...:

    Рарник пж ребят

  1. Анонимный комментирует...:

    VarangaOfficial - варанга аналог - проверенные и достоверные факты. Воспользовавшись нашим ресурсом, вы получите возможность узнать полную информацию об этом лекарственном средстве. Лично увидеть данные о клиническом тестировании геля, прочитать отзывы реальных пациентов и врачей, использующих крем в своей лечебной практике. Изучить инструкцию по использованию, прочесть особенности и методы работы комплекса, понять, почему крем Варанга настолько эффективен, где можно купить сертифицированный, оригинальный препарат и, как не нарваться на подделку. Мы очень тщательно проверяем размещаемые на сайте данные. Предоставляем нашим пользователям сведения, которые были почерпнуты только из достоверных источников. Если вы нашли признаки развития грибка или уже довольно продолжительное время, без ощутимых результатов пытаетесь избавиться от этого коварного, неприятного недуга, наш сайт покажет вам простой и быстрый способ устранения проблемы. Приобщайтесь и живите полноценной, здоровой жизнью. Мы собрали ответы на все вопросы на одном информационном ресурсе.

  1. Анонимный комментирует...:

    Интимный чат пар с рунетками, где рунетки в порно в прямом эфире демонстрируют интимное представление пар на веб-сайтах, как семья, девушки чат порно Никогда не лесби онлайн-шоу. Лучшие приватные секс-чаты пар с рунетками на этом сайте. Рунетки пары - это специализированный отдел официального сайта. Как известно владельцу, сайт предлагает услугу для общения пользователей через чаты с порнофильмами. Используя главную страницу, у вас есть возможность заметить множество чрезвычайно очаровательных и лучших девушек. Но такое обстоятельство не означает, что этот сайт полностью и в целом посвящен потребителям, которые обременены привычной сексуальной ориентацией. Рунетки, где сидят пары, это специальные комнаты, которые ничем не отличаются от тех, в которых все барышни сидят на платформе. Только в таких комнатах сидят пары, например, девушка с личным парнем. Парень ласкается, или у него есть девушка, и жители на ресурсе поддерживают его, или просят его сделать что-то за вознаграждение. Секс чат пары рунетки прямо в интернете - это не просто пара, где сидит парень с воплощением, это может стать совсем наоборот. Например, в секс-фильмах 18+ общаются пары, где сидят два супруга или два мальчика. На этом сайте каждый найдет любую интимную комбинацию, о которой он только может мечтать для себя, а когда они ее даже не найдут, то вы сможете легко и просто создать ее самостоятельно. Порно чат пары очень популярны. Представьте, что симпатичная и очень аппетитная девушка стоит раком, а ее мужчина средних лет очень старается трахнуть и никогда не кончает, так как наблюдатели здесь просили его не кончать. Он выполняет их просьбы, и за последние годы ему очень регулярно передаются подарки в виде жетонов.

  1. Анонимный комментирует...:

    Все, что согласуется с некоторыми параметрами компании, можно будет подать онлайнРейтинг кредитов На карту оперативно без комиссии в микрофинансовую организацию. Существует небольшое количество условий для клиентов, и не требуется доказывать платежеспособность или предоставлять залог. Оформить микрозайм можно мгновенно и без задержек в любом мфо, и такая услуга по карману любой категории клиентов - пенсионерам, безработным и молодежи. Процедура получения занимает несколько секунд, а также не требует личного пребывания в офисе компании. Для того, чтобы в обязательном порядке оформить быстрый микрозайм, ознакомиться с выбранным предложением через фильтры, а также возможность использовать микрокалькулятор для расчета переплат, прибегните к нашему ресурсу. Микрокредит без лишних вопросов мгновенно составляет довольно выгодный кредитный продукт, который будет оптимальным для всех, кому может понадобиться сумма до 20-80 тысяч на несколько недель. Также, в том числе и те, кто сообщит о своей платежеспособности или предоставит справки с одного места обслуживания, налоговой службы, смогут воспользоваться кредитом. Прежде всего, кредит на карту сбербанка имеет ряд нюансов: - При первоначальном обращении у вас есть возможность оформить беспроцентную рассрочку, а в оптовом процессе - промо-коды и большой лимит; - вы можете подать заявку на получение кредита на личную карту, на расчетный счет, наличными на webmoney; - ставка немного выше, чем у обычных потребительских кредитов, в связи с этим общая стоимость кредита может быть выше; - каждый заемщик может сам выбрать идеальный вид расчета кредита, не будет необходимости в залоге, справке с должности или налоговой; - состояние кредитной истории не влияет на анализ компании; - вы можете получить мини-кредит без перерывов и выходных, даже ночью или в выходные; - мгновенный ответ на запрос; -, микрозаймом удобнее воспользоваться сегодня или договориться о продлении срока кредита на пару дней. Чтобы взять микрокредит, вам понадобится только копия вашего паспорта, а также второй документ, удостоверяющий личность. Что касается требований, то их немного: совершеннолетие, российское гражданство, вид на жительство в российской федерации. Процедура оформления займов занимает не более одного и также не требует индивидуального присутствия заемщика при работе мфо.

  1. Анонимный комментирует...:

    Два раза в год у вас есть возможность прочитать свою кредитную историю и кредитный рейтинг - совершенно бесплатно. Мы подготовили для них инструкции. Неприятное финансовое положение может находиться в режиме нон-стоп, и нет возможности организовать помощь от родственников (друзей, родственников). Имеет смысл надеяться на вашу пользу. Кредиты или деньги подойдут для решения проблемы. Лучше вообще быстро взять кредит в одном из профессиональных учреждений - мфо, работающих в режиме 7-24. Они очень актуальны, когда рассматривают заявки при отсутствии необходимости посещать офисы - онлайн. займ онлайн, Недавно открытые, представляют интерес для заемщиков отдельно. Такие фирмы наращивают свою клиентскую базу и с начальных этапов могут реализовывать очень хорошие условия по сравнению с конкурентами. Но, поскольку новые мфо еще не были известны, рекомендуется оставаться независимо, даже если это базовая проверка - проверить наличие действующей лицензии центрального банка, хорошие отзывы потребителей и т. Д. Наша команда собирает новые, недавно открытые мфо, которые начали функционировать в 2021 году, с нашей платформы. Совершенно необязательно, чтобы преимущества микрокредитования во всех таких организациях становились более выгодными по сравнению с другими компаниями. Однако процент для этого выше. Условия получения микрокредитов онлайн одинаковы в каждой мфо, независимо от ситуации, как давно они открылись. Вот типичный список таких условий: - Клиент должен достичь совершеннолетия, - у заемщика должен быть российский паспорт с регистрацией, - дома может быть идеальная кредитная карта или личный кошелек для увеличения заемных денег. Самым приятным бонусом за предоставление вам микрокредита является акция в той или иной мфо. На территории действия специального предложения условия кредита могут быть более выгодными - низкая ставка (иногда нулевой процент), более длительный срок кредита, больший лимит на сумму микрокредита. Акции проводятся не только для постоянных клиентов, но и для любителей. Обратившись в впервые открывшуюся мфо, вы получаете возможность рассчитывать на кредит без процентов. В банке запрос на получение кредита может считаться довольно дорогим - иногда срок доходит до недели. Ждать осталось не так много времени, к тому же необходимая сумма не должна быть такой, чтобы имело смысл идти в отделение банка. Если кредит нужен срочно, лучше всего обратиться в микрофинансовую организацию, если она работает онлайн. Запрос будет изучен в течение пары секунд, и после одобрения деньги мгновенно поступят на банковскую карту клиента.

  1. Анонимный комментирует...:

    Гостевой дом "жемчужина байкала" расположен на северном берегу озера байкал в трех километрах от организации интересного мегаполиса северобайкальска в своем доме на деревянном здании. Из дмитрова улан-удэ. Гостевой дом приглашает вас хорошо провести время в приятной компании и восстановить силы со своими близкими на другом озере байкал. Гостевой дом "отдых на простоквашино" стоит рядом с берегом озера байкал в поселке турка на протяжении 165 километров. На первом этаже гостевого дома "приют альпиниста" расположены бары и кафе (предоставляются бодрящий напиток турецких программ, фито-кофе), таверна, фито-баня, каминный зал (телевизор (телепередачи, рекламные ролики, кино, звук). К вашему вниманию: оборудованная кухня-столовая, караоке, спутниковое телевидение, dvd, обычный теннис, американская карта, стеклянная беседка. Продукт: бесплатные передающие устройства, спортивный зал, бильярдная, бары, сауна со строительством, прокат велосипедов, детская система, бесплатная парковка. В другой коробке на первом этаже есть бассейн со структурой. На первом этаже находится кухня, в которой можно самостоятельно замесить еду, гостиная. Спартанцы - уведомление о передаче пятиуровневой истории в пределах этого региона аттики находится полуостров под названием пелопоннес. На земле есть какое-то здание с 2 ухоженными зданиями. На земле есть 10 домов. На земле есть 2 корпуса, беседка, зона барбекю. Во время/во время>|на протяжении|во время>>|на протяжении|во время>|во время|во время>>> прошлого века некоторые из программ были применены к хранению озера байкал: противодействие браконьерству, нелицензионной вырубке лесов в джунглях, правила применения безопасности на байкале были усыновленный. Вы получите возможность пройтись пешком за пять-десять минут до: байкальского музея, нерпинария, видового ресурса наоборот, шаман давно стоит каменной скалой, но что там. Дом, по сути, представляет собой особняк из оцилиндрованного бревна, расположенный во многих километрах байкальской системы. Гостевой дом "далай" расположен в поселке максимиха, в одной из самых просторных комнат, пользуются душем, туалетом, горячей водой). Гостевые комнаты дома оборудованы, в этих местах есть холодная и душная вода, ванная комната, кухня для приготовления пищи. Вместо очередной оплаты мы предоставляем путешественникам здоровую пищу (классическая сибирская кухня), русскую сауну. За один год армада ракообразных (эпикура) имеет возможность трижды обеззаразить верхний пятидесятиметровый слой воды. Производственная компания работает как зимой, так и летом. До десяти раз в год они пропускают за собой гигантское количество озерной воды, путевки на байкал Фильтруя, а также очищая ее. За отдельную плату: действующая сауна. Здания ухожены, в них есть все свои прелести для удобства существования. Доброго дня, граждане ульяновска, приглашенные по делу, советую вам приветствовать нас в безупречном доме из трех домов с продуманным разнообразием на озере байкал в поселке листвянка, в доме есть продукты для уютного существования, чистые наборы, но полатенца, эстетичный внешний вид дома открывается из окон. Гостиница "мельница" расположена в коттеджном поселке на бору. Гостиница "деревня" расположена в поселке листвянка в крестовой пади, на склоне холма в семидесяти метрах от озера байкал, откуда открывается один из лучших видов на озеро. Вы найдете отель "натали" в сосновом бору, в пятнадцати минутах ходьбы от озера байкал.

  1. Анонимный комментирует...:

    Широкоформатная печать врезок - это первый из рекомендуемых вариантов функционирования нашей организации в столице. Наша компания разрабатывает масштабные изображения, которые нашли личное признание во внешнем спаме. Форматная печать рекламы может похвастаться следующими преимуществами: - Вероятность размазывания полноцветных изображений на баннерах больших размеров и всех конфигураций; - продукты каким-то образом спроектированы изнутри помещений, аналогично на открытом воздухе; - полиактивный набор рекламных материалов по довольно заманчивой цене для нанесения изображений; - окна не поддаются механическим повреждениям, тогда мы сможем сохранить свой первоначальный внешний вид в течение трех-четырех лет. Цены на печать спама в москва посередине.E (рассчитывается в соответствии с внутренним тарифом компании, представленным на вкладке "пуск" веб-ресурса) Для технологического оттиска вставок используется материя профиля плотностью от 280 до 620 лет./М2 да что там имеет ширину около трех-двух метров. Наша компания предоставляет в качестве рекламных пленочных рамок для основных рекламных щитов, их размер составляет 6х3 метра или 3х12 метров, баннер ролл ап Никогда не бывает изделий оптимального образца (определенное количество материалов долгожданных размеров сваривается в единый). В связи с этим необходимо выбрать внешнюю печать вкладышей вместе с "autopak" Наша компания производит наружную печать окон в столице с использованием сольвентного плоттера vutek ultra vu 3360 (производство сша). Такие устройства на долгие годы займут лидирующие позиции в мире в обществе механизмов для производства крупномасштабного видео и фотоформата. Особенности оттисков вставок для материалов в специальном оборудовании vutek ultra vu 3360: - Отличное качество цветопередачи; - выразительность и разборчивость содержимого изображения; - хорошая скорость печати. Высокая широта широкоформатных спам-экранов происходит до трех секунд. Лицензионные штампы - 360 единиц, при всем увеличении размера панели желательно уменьшить. Быстрая стойкость рисунков в vutek достигается за счет поддержания: в чернилах, специальных пигментных стимуляторах. Компания "автопак" дает годичную гарантию на наружные печатные площадки. Кроме того, наша компания предоставляет бонусы за крупномасштабные заказы.

Отправить комментарий