Сетевое программирование. Сервер на C#

471
24 ноября 2017, 04:26

Здравствуйте! Год с лишним изучаю C#, писал проекты на WF, Unity3D. дело дошло до сетевого программирования. Начал изучать его с книжкой "Библия C#". Решил попробовать написать небольшое чат-приложение. Опираясь на пример в данной книге, я смог написать несколько строк кода сервера (до клиента дело не дошло), и у меня возникли вопросы (возможно, они покажутся глупыми, но я пытался искать в интернете информацию о написании сервера на C#, не встречал подобных примеров, а сам в сетевой части я пока что полный ноль, буду благодарен, если посоветуете дополнительную литературу):

  1. Сервер примет данные только один раз, или будет принимать всё время, пока находится в рабочем состоянии? (потому что программа, написанная автором учебника, может посылать от имени клиента данные на сервер лишь один раз, после чего клиент "зависает" при попытке отправить данные во второй раз)
  2. Данный сервер создан для принятия данных только от одного клиента? Если да, то каким образом можно организовать, чтобы он работал сразу для нескольких клиентов?
  3. Если возможно, сформулируйте, что такое сокет на более понятном языке. (Что в учебнике, что в интернете довольно непонятные формулировки данного понятия)

     private void ServerStart_Click(object sender, EventArgs e)
     {
            if (!(String.IsNullOrWhiteSpace(portEnter.Text) || (server!=null && server.Connected)))
            {
                port = Int32.Parse(portEnter.Text);
                server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                EndPoint endPoint = new IPEndPoint(IPAddress.Any, port);

try { server.Bind(endPoint); server.Listen(20); } catch (Exception exc) { MessageBox.Show("Возникла ошибка при запуске сервера: "+ exc.Message); return; } server.BeginAccept(new AsyncCallback(AsyncAccept),server); } else { MessageBox.Show("Сервер невозможно запустить. Возможно, сервер уже запущен или отсутствует значение порта для запуска."); } } void AsyncAccept(IAsyncResult result) { Socket serverSocket = (Socket)result.AsyncState; SocketData data = new SocketData(); data.clientConnection = serverSocket.EndAccept(result); data.clientConnection.BeginReceive(data.buffer, 0, 1024, SocketFlags.None,new AsyncCallback(AsyncRead), data); } void AsyncRead(IAsyncResult result) { SocketData data = (SocketData)result.AsyncState; data.clientConnection.EndReceive(result); }
READ ALSO
Параметры компилятора C#

Параметры компилятора C#

Каким образом можно добавить свой параметр компилятора в Visual Studio 2017? К примеру, мне нужно скомпилировать с параметром /out:MyAssamblydll

290
OutOfRangeExeption в перегрузке оператора

OutOfRangeExeption в перегрузке оператора

Здравтсвуйте, не получается отловить исключениеКогда использую оператор неявного приведения в строку - выбрасывает исключение

248
C# MVVM взаимодействие моделей

C# MVVM взаимодействие моделей

Как по паттерну MVVM модели могут обмениваться информацией друг с другом?? Я читал, что с случае с view-model необходимо ставить MVVM Light Toolkit и юзать...

277
Добавление роли пользователю ASP.NET Identity

Добавление роли пользователю ASP.NET Identity

При регистрации в AccountController пытаюсь добавить роль пользователю, однако вылетает такая ошибка (картинка снизу)Делал по примеру и как там заявлено,...

389