Результаты поиска
| |
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) Набросай клиента, попробуй сконектиться, отослать данные. Нет, я вопрос задал не так. Как проверить, что программой начал использоваться порт? Ведь тот или иной порт может быть занят другой любой программой (т.е. закрыт)
|
|
| |
|