Понедельник, 25 Августа 2025, 01:29

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
SaiteiДата: Воскресенье, 19 Августа 2012, 22:34 | Сообщение # 1041 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, неа, пытался... По сути дела вот что я хочу сделать: Появилось новое подключение -> Пишем об этом в консоли
Вот мой сервер:
Code

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

namespace asServer
{
     class server
     {
         public static void serverStart()  
         {

             System.Console.Title = "Server";
             System.Console.ForegroundColor = ConsoleColor.Green;
             IPEndPoint fullAddress = null; /* x.x.x.x:xxxx; (IP:port)*/
             System.Console.WriteLine("Какой порт поставить в режим прослушивания?");
             System.Console.Write(">>");
             int portInUse, online;
             string pPort = System.Console.ReadLine();
             int.TryParse(pPort, out portInUse);
             System.Console.WriteLine("Сколько допускать подключений к порту " + portInUse + "?");
             System.Console.Write(">>");
             string tOnline = System.Console.ReadLine();
             int.TryParse(tOnline, out online);
             System.Console.WriteLine("Запускаем сервер...");
             Socket mySock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             System.Console.WriteLine("port: " + portInUse);
             System.Console.WriteLine("Количество возможных подключений: " + online);
             try
             {
                 fullAddress = new IPEndPoint(IPAddress.Any, portInUse);
                 System.Console.WriteLine("Ставим порт " + portInUse + " в режим прослушивания...");
                 mySock.Bind(fullAddress);
                 mySock.Listen(online);
             }
             catch (ObjectDisposedException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (InvalidOperationException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             System.Console.WriteLine("Никаких проблем! Сервер запущен!");
             Console.WriteLine("Ждём новых соединений...");
             Socket sAccept = mySock.Accept();  
             Console.WriteLine("Есть соединение!");
      
             }
         
         public static void Main(string[] args)
         {
             serverStart();
             System.Console.ReadKey();
         }
     }
}

А вот клиент:
Code

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

namespace asClient
{
     class asClient
     {
         public static void clientStart()
         {
             System.Console.Title = "Client";
             System.Console.ForegroundColor = ConsoleColor.Green;
             byte[] data = new byte[1024];
             int serverPort = 0;
             System.Console.WriteLine("По какому IP подключиться к серверу?");
             System.Console.Write("Ваш выбор: ");
             string serverIP = System.Console.ReadLine();
             System.Console.WriteLine("Порт сервера?");
             System.Console.Write("Ваш выбор: ");
             string sPort = System.Console.ReadLine();
             int.TryParse(sPort, out serverPort);
             System.Console.WriteLine("IP: " + serverIP);
             System.Console.WriteLine("Port: " + serverPort);
             System.Console.WriteLine("Full Address: " + serverIP + ":" + serverPort);
             System.Console.WriteLine("Подключаемся по " + serverIP + ":" + serverPort + "...");  
             IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
             Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             try
             {
                 server.Connect(ipep);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("Не могу подключиться к серверу...");
                 Console.WriteLine(e.ToString());
                 return;
             }

         }
         public static void Main()
         {
             clientStart();
             System.Console.ReadKey();
         }
     }
}

Добавлено (19.08.2012, 22:34)
---------------------------------------------
p.s.

Quote (Saitei)
Console.WriteLine("Ждём новых соединений...");
             Socket sAccept = mySock.Accept();  
             Console.WriteLine("Есть соединение!");

вот здесь эта весч тормозит работу всей консоли. В бесконечном цикле такое не прокатит
SaiteiДата: Воскресенье, 19 Августа 2012, 22:13 | Сообщение # 1042 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Code
    while (true)
             {
                 if (mySock.Accept();)
                 {

                 }

             }

Почему так писать НЕЛЬЗЯ? Что мне делать? Синтаксис ругается
SaiteiДата: Воскресенье, 19 Августа 2012, 18:27 | Сообщение # 1043 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Сервер переписываю. Пока что всё ок вроде?

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

namespace asServer
{
     class server
     {
         public static void serverStart()  
         {
             System.Console.Title = "Server";
             System.Console.ForegroundColor = ConsoleColor.Green;
             IPEndPoint fullAddress = null; /* x.x.x.x:xxxx; (IP:port)*/
             System.Console.WriteLine("Какой порт поставить в режим прослушивания?");
             System.Console.Write(">>");
             int portInUse, online;
             string pPort = System.Console.ReadLine();
             int.TryParse(pPort, out portInUse);
             System.Console.WriteLine("Сколько допускать подключений к порту " + portInUse + "?");
             System.Console.Write(">>");
             string tOnline = System.Console.ReadLine();
             int.TryParse(tOnline, out online);
             System.Console.WriteLine("Запускаем сервер...");
             Socket mySock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             System.Console.WriteLine("port: " + portInUse);
             System.Console.WriteLine("Количество возможных подключений: " + online);
             try
             {
                 fullAddress = new IPEndPoint(IPAddress.Any, portInUse);
                 System.Console.WriteLine("Ставим порт " + portInUse + " в режим прослушивания...");
                 mySock.Bind(fullAddress);
                 mySock.Listen(online);
             }
             catch (ObjectDisposedException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }
             catch (InvalidOperationException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.Write("Тект ошибки: ");
                 Console.WriteLine(e.Message);
             }

         }
         public static void Main(string[] args)
         {
             serverStart();
             System.Console.ReadKey();
         }
     }
}

Добавлено (19.08.2012, 18:27)
---------------------------------------------
переписал клиент и сервер. Кто-то напишите мне в ЛС свои контактные данные... Я всё это дело связал (Listen\Agree), но теперь нужно окончательно понять как переменные передавать

SaiteiДата: Воскресенье, 19 Августа 2012, 16:07 | Сообщение # 1044 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Archido,
http://msdn.microsoft.com/en-us/library/fx6588te
http://msdn.microsoft.com/en-us/library/6y0e13d3
ещё не ковырялся... Вот и спрашиваю

Добавлено (19.08.2012, 16:07)
---------------------------------------------

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

// State object for reading client data asynchronously
public class StateObject {
     // Client  socket.
     public Socket workSocket = null;
     // Size of receive buffer.
     public const int BufferSize = 1024;
     // Receive buffer.
     public byte[] buffer = new byte[BufferSize];
// Received data string.
     public StringBuilder sb = new StringBuilder();   
}

public class AsynchronousSocketListener {
     // Thread signal.
     public static ManualResetEvent allDone = new ManualResetEvent(false);

     public AsynchronousSocketListener() {
     }

     public static void StartListening() {
         // Data buffer for incoming data.
         byte[] bytes = new Byte[1024];

         // Establish the local endpoint for the socket.
         // The DNS name of the computer
         // running the listener is "host.contoso.com".
         IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
         IPAddress ipAddress = ipHostInfo.AddressList[0];
         IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

         // Create a TCP/IP socket.
         Socket listener = new Socket(AddressFamily.InterNetwork,
             SocketType.Stream, ProtocolType.Tcp );

         // Bind the socket to the local endpoint and listen for incoming connections.
         try {
             listener.Bind(localEndPoint);
             listener.Listen(100);

             while (true) {
                 // Set the event to nonsignaled state.
                 allDone.Reset();

                 // Start an asynchronous socket to listen for connections.
                 Console.WriteLine("Waiting for a connection...");
                 listener.BeginAccept(  
                     new AsyncCallback(AcceptCallback),
                     listener );

                 // Wait until a connection is made before continuing.
                 allDone.WaitOne();
             }

         } catch (Exception e) {
             Console.WriteLine(e.ToString());
         }

         Console.WriteLine("\nPress ENTER to continue...");
         Console.Read();
          
     }

     public static void AcceptCallback(IAsyncResult ar) {
         // Signal the main thread to continue.
         allDone.Set();

         // Get the socket that handles the client request.
         Socket listener = (Socket) ar.AsyncState;
         Socket handler = listener.EndAccept(ar);

         // Create the state object.
         StateObject state = new StateObject();
         state.workSocket = handler;
         handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
             new AsyncCallback(ReadCallback), state);
     }

     public static void ReadCallback(IAsyncResult ar) {
         String content = String.Empty;
          
         // Retrieve the state object and the handler socket
         // from the asynchronous state object.
         StateObject state = (StateObject) ar.AsyncState;
         Socket handler = state.workSocket;

         // Read data from the client socket.  
         int bytesRead = handler.EndReceive(ar);

         if (bytesRead > 0) {
             // There  might be more data, so store the data received so far.
             state.sb.Append(Encoding.ASCII.GetString(
                 state.buffer,0,bytesRead));

             // Check for end-of-file tag. If it is not there, read  
             // more data.
             content = state.sb.ToString();
             if (content.IndexOf("<EOF>") > -1) {
                 // All the data has been read from the  
                 // client. Display it on the console.
                 Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                     content.Length, content );
                 // Echo the data back to the client.
                 Send(handler, content);
             } else {
                 // Not all data received. Get more.
                 handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                 new AsyncCallback(ReadCallback), state);
             }
         }
     }
      
     private static void Send(Socket handler, String data) {
         // Convert the string data to byte data using ASCII encoding.
         byte[] byteData = Encoding.ASCII.GetBytes(data);

         // Begin sending the data to the remote device.
         handler.BeginSend(byteData, 0, byteData.Length, 0,
             new AsyncCallback(SendCallback), handler);
     }

     private static void SendCallback(IAsyncResult ar) {
         try {
             // Retrieve the socket from the state object.
             Socket handler = (Socket) ar.AsyncState;

             // Complete sending the data to the remote device.
             int bytesSent = handler.EndSend(ar);
             Console.WriteLine("Sent {0} bytes to client.", bytesSent);

             handler.Shutdown(SocketShutdown.Both);
             handler.Close();

         } catch (Exception e) {
             Console.WriteLine(e.ToString());
         }
     }

     public static int Main(String[] args) {
         StartListening();
         return 0;
     }
}


Вот строка:
Code
// Received data string.
     public StringBuilder sb = new StringBuilder();  

что она делает конкретно в этом коде?
SaiteiДата: Воскресенье, 19 Августа 2012, 01:11 | Сообщение # 1045 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Quote (Archido)
на тему блокирующих и неблокирующих сокетов.

зачем?
SaiteiДата: Воскресенье, 19 Августа 2012, 01:10 | Сообщение # 1046 | Тема: Сокеты??
старожил
Сейчас нет на сайте
arthurfok, это зависит от твоих планов. Твоя игра, не моя. x,y я передавал бы по UDP
SaiteiДата: Воскресенье, 19 Августа 2012, 00:22 | Сообщение # 1047 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Как-то можно вывести на консоль от кого приходят пакеты?) ip-адрес?
SaiteiДата: Суббота, 18 Августа 2012, 23:57 | Сообщение # 1048 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, операторы многие знал. Честно-честно) Все кроме try + catch. Да и после того, как всё запахало, я врубился в вопрос и не поленился прочесть про них)

Добавлено (18.08.2012, 23:57)
---------------------------------------------
Объясните пожалуйста разницу между синхронными и асинхронными серверами

SaiteiДата: Суббота, 18 Августа 2012, 23:51 | Сообщение # 1049 | Тема: Сокеты??
старожил
Сейчас нет на сайте
arthurfok, можно использовать и TCP, и UDP) Просто нужно ли это?
SaiteiДата: Суббота, 18 Августа 2012, 22:31 | Сообщение # 1050 | Тема: Поясните, пожалуйста!
старожил
Сейчас нет на сайте
Какое утверждение?
Quote (niko42)
Здравствуйте, уважаемые дамы и господа!

В моей голове есть некий миф, хотелось бы его развееть.
Т.е. я рисую объекты в 3Dmax и их анимацию, далее запускаю какой-нибудь движок (пример - unreal Engine), загружаю объекты и начиная создавать геодату (мол сборка конструктора из разных объектов).
Прошу не затрагивать скриты.
Уточните, пожалуйста, верно ли мое утверждение или нет?
Или есть другой способ ?

Спасибо!

Без обид, я ничего не понял... Что тебя интересует?
SaiteiДата: Суббота, 18 Августа 2012, 21:01 | Сообщение # 1051 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Archido, книжки листаю, есть) В справке из майкрасофта роюсь

Ну да)) Теперь придется каждую строчку копать, мастырить... Эээх... Я радовался от надписи "Есть соединение!". Теперь надо будет меседж передать и вывести на экран))
SaiteiДата: Суббота, 18 Августа 2012, 20:43 | Сообщение # 1052 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
*начал танцевать на столе и безумно орать* ПАШЕТ
SaiteiДата: Суббота, 18 Августа 2012, 20:31 | Сообщение # 1053 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, код клиента слизан с примера:
Code

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Timers;

namespace client
{
     class classClient
     {
         static void Main()
         {
             IPEndPoint Addr = null; //конечная точка(IP и порт)
         Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет
         IPAddress ipAddress = null; //IP-адрес
         Console.Title = "Клиент";
         ipAddress = Dns.GetHostEntry("127.0.0.1").AddressList[0];
         Addr = new IPEndPoint(ipAddress, 8563); //"localhost" = 127.0.0.1
         s.Connect(Addr); //Коннектимся к срверу
         while (true) //Вечная истина <img src="http://s12.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" />
         {
             byte[] msg = Encoding.UTF8.GetBytes(Console.ReadLine()); //Конвертируем
             s.Send(msg); //Отправляем
         }
         }
     }
}
SaiteiДата: Суббота, 18 Августа 2012, 19:52 | Сообщение # 1054 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, да мне просто лень было много раз писать catch. Вот и написал компьютеру "либо то, либо это, либо сё" xD
Роюсь в справке

Добавлено (18.08.2012, 19:11)
---------------------------------------------
Плачу горькими слезами

Code
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Timers;

namespace server
{
     class mainStart
     {
         static void Main(string[] args)
         {
             IPEndPoint Addr = null; //IP и порт
             int portInUse = 8563;
             System.Console.Title="Сервер"; /*Название окна*/
             System.Console.ForegroundColor = ConsoleColor.Green; /*Весь текст в консоли теперь зелёный! ^^*/
             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /*Создание основного сокета. AddressFamily - указание на тип семейства адресов (InterNetwork = IPv4),  
                    * SocketType - указание на тип сокетного подключения,  ProtocolType - используемый протокол для передачи данных */
             Console.WriteLine("Запуск сервера...");
             Addr = new IPEndPoint(IPAddress.Any, portInUse);
             s.Bind(Addr);
             try
             {
                 Console.WriteLine("Прослушиваемый порт: " + portInUse);
                 Console.WriteLine("Адрес: " + Addr);
                 s.Listen(30); /*Порт ставим в режим прослушивания. Поддерживаем 30 подключений*/
             }
             catch (ObjectDisposedException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.WriteLine(e.Message);
             }
             catch (SocketException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.WriteLine(e.Message);
             }
             catch (InvalidOperationException e)
             {
                 Console.WriteLine("We have some problems :(");
                 Console.WriteLine(e.Message);
             }
             Console.WriteLine("Waiting...");
             Socket sAccept = s.Accept(); /*Ожидаем подключения*/
             Console.WriteLine("Есть соединение!");
             while (true)
             {
                 byte[] msg = new byte[sAccept.Available];
                 sAccept.Receive(msg); /*Принимаем сообщение*/
                 Console.WriteLine(Encoding.UTF8.GetString(msg)); /*Конвертируем и выводим на экран*/
             }
         }
     }
}


Это сервер. А вот в клиенте вечно ругается на connect по addr. Пишет что адрес несовместим с IPv4 и бла-бла-бла. У меня печаль, ребят...

Добавлено (18.08.2012, 19:52)
---------------------------------------------
Кто-нибудь может на короткое время взять меня под своё крыло? Просто часто я нуждаюсь в наставлениях... Справку читаю, сам экспериментирую. Просто помощь нужна

SaiteiДата: Суббота, 18 Августа 2012, 18:12 | Сообщение # 1055 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, я попробовал запихнуть все три исключения через "||". Компилятор люто ругается
SaiteiДата: Суббота, 18 Августа 2012, 18:09 | Сообщение # 1056 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, я как понял все исключения обрабатываются через catch? Т.е. если сокет будет закрыт, то только в этом случае выполнится весь код, что стоит после catch'a?
SaiteiДата: Суббота, 18 Августа 2012, 18:05 | Сообщение # 1057 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy,
Code

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

namespace server
{
     class mainStart
     {
         static void Main(string[] args)
         {
             IPAddress ipAddr = null; //IP-Адрес
             IPEndPoint Addr = null; //IP и порт
             int portInUse = 5300;
             System.Console.Title="Сервер"; /*Название окна*/
             System.Console.ForegroundColor = ConsoleColor.Green; /*Весь текст в консоли теперь зелёный! ^^*/
             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /*Создание основного сокета. AddressFamily - указание на тип семейства адресов (InterNetwork = IPv4),  
                    * SocketType - указание на тип сокетного подключения,  ProtocolType - используемый протокол для передачи данных */
             Console.WriteLine("Запуск сервера...");
             Addr = new IPEndPoint(IPAddress.Any, portInUse);
             s.Bind(Addr);
             try
             {
                 s.Listen(30); /*Порт ставим в режим прослушивания. Поддерживаем 30 подключений*/
             }
             catch (ObjectDisposedException e)
             {
                 Console.WriteLine(e->Message);
             }  
             Console.WriteLine("Прослушиваемый порт: "+ portInUse);
             Console.WriteLine("Адрес: " + Addr);

             Console.ReadKey();
         }
     }
}

подчеркнуло красным e->Message. Ругается на "->":
Quote

Error 2 The * or -> operator must be applied to a pointer C:\Users\Vlad\AppData\Local\Temporary Projects\server\mainStart.cs 34 35 server

Добавлено (18.08.2012, 18:05)
---------------------------------------------
fix:

Code
   Console.WriteLine(e.Message);
SaiteiДата: Суббота, 18 Августа 2012, 17:51 | Сообщение # 1058 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
karuy, интересуют ObjectDisposedException и SocketException... Не смог их использовать, я явно что-то понял не так
SaiteiДата: Суббота, 18 Августа 2012, 17:45 | Сообщение # 1059 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Send() и Accept() мне в помощь! Капец, гениально!))) Я целый день бился об стену
SaiteiДата: Суббота, 18 Августа 2012, 17:42 | Сообщение # 1060 | Тема: Клиент-серверная связь. Сокеты. Помогите пожалуйста
старожил
Сейчас нет на сайте
Quote (karuy)

http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.accept.aspx В msdn все есть и все расписано.

Там и вычитал))
Quote (karuy)
Набросай клиента, попробуй сконектиться, отослать данные.

Нет, я вопрос задал не так. Как проверить, что программой начал использоваться порт? Ведь тот или иной порт может быть занят другой любой программой (т.е. закрыт)
Поиск:

Все права сохранены. GcUp.ru © 2008-2025 Рейтинг