Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCPClient / TCPListener проблема с русским языком 
:(
    Опции темы
ziga
Дата 13.5.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: нет
Всего: 1



Взял пример из MSDN 

TCPClient
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            string test;
            Console.Write("test: ");
            test = Console.ReadLine();

            Connect("127.0.0.1", test);
        }

        static void Connect(String server, String message)
        {
            try
            {
                // Create a TcpClient.
                // Note, for this client to work you need to have a TcpServer 
                // connected to the same address as specified by the server, port
                // combination.
                Int32 port = 13000;
                TcpClient client = new TcpClient(server, port);

                // Translate the passed message into ASCII and store it as a Byte array.
                Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

                // Get a client stream for reading and writing.
                //  Stream stream = client.GetStream();

                NetworkStream stream = client.GetStream();

                // Send the message to the connected TcpServer. 
                stream.Write(data, 0, data.Length);

                Console.WriteLine("Sent: {0}", message);

                // Receive the TcpServer.response.

                // Buffer to store the response bytes.
                data = new Byte[256];

                // String to store the response ASCII representation.
                String responseData = String.Empty;

                // Read the first batch of the TcpServer response bytes.
                Int32 bytes = stream.Read(data, 0, data.Length);
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                Console.WriteLine("Received: {0}", responseData);

                // Close everything.
                stream.Close();
                client.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }

            Console.WriteLine("\n Press Enter to continue...");
            Console.Read();
        }
    }
}



TCPListener

Код

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TcpListener1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener server=null;   
            try
            {
              // Set the TcpListener on port 13000.
              Int32 port = 13000;
              IPAddress localAddr = IPAddress.Parse("127.0.0.1");
              
              // TcpListener server = new TcpListener(port);
              server = new TcpListener(localAddr, port);

              // Start listening for client requests.
              server.Start();
                 
              // Buffer for reading data
              Byte[] bytes = new Byte[256];
              String data = null;

              // Enter the listening loop.
              while(true) 
              {
                Console.Write("Waiting for a connection... ");
                
                // Perform a blocking call to accept requests.
                // You could also user server.AcceptSocket() here.
                TcpClient client = server.AcceptTcpClient();            
                Console.WriteLine("Connected!");

                data = null;

                // Get a stream object for reading and writing
                NetworkStream stream = client.GetStream();

                int i;

                // Loop to receive all the data sent by the client.
                while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
                {   
                  // Translate data bytes to a ASCII string.
                  data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                  Console.WriteLine("Received: {0}", data);
               
                  // Process the data sent by the client.
                  data = data.ToUpper();

                  byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                  // Send back a response.
                  stream.Write(msg, 0, msg.Length);
                  Console.WriteLine("Sent: {0}", data);            
                }
                 
                // Shutdown and end connection
                client.Close();
              }
            }
            catch(SocketException e)
            {
              Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
               // Stop listening for new clients.
               server.Stop();
            }

              
            Console.WriteLine("\nHit enter to continue...");
            Console.Read();
          }   
        }
}



возникли несколько вопросов:
  • Запускаю сервак, и клиент отправляю клиентом сообщение всё нормально возвращает. Единственная проблема то что когда отправляю текст на русском языке возвращает "???????????????" в чём проблема?
  • Как мне передать сообщение больше чем объём 250 байт (незная размера информации)
  • Можно такми способом получать таблицу из базы к примеру отправив клиентом select * from user получить ответ со списком пользователей в виде таблицы? если да то как лучше всего это сделать?



PM MAIL   Вверх
SickFxck
Дата 31.5.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Цитата(ziga @  13.5.2010,  15:44 Найти цитируемый пост)
Запускаю сервак, и клиент отправляю клиентом сообщение всё нормально возвращает. Единственная проблема то что когда отправляю текст на русском языке возвращает "???????????????" в чём проблема?

Проблема в System.Text.Encoding.ASCII.GetBytes(). Можешь попробовать UTF-8.

Цитата(ziga @  13.5.2010,  15:44 Найти цитируемый пост)
Как мне передать сообщение больше чем объём 250 байт (незная размера информации)

Например, передавая сначала размер (куска или всего сообщения).

Цитата(ziga @  13.5.2010,  15:44 Найти цитируемый пост)
Можно такми способом получать таблицу из базы к примеру отправив клиентом select * from user получить ответ со списком пользователей в виде таблицы? если да то как лучше всего это сделать?

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

Добавлено через 32 секунды
На дату не посмотрел
PM MAIL   Вверх
nmn
Дата 30.7.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



Цитата(SickFxck @  31.5.2010,  21:51 Найти цитируемый пост)
Ни в коем случае клиент не должен отправлять запрос или его часть, который будет выполняться на сервере, за исключением особых случаев. Клиент, по-хорошему, должен отправить какую-то команду, которую сервер воспримет как запрос таблицы пользователей.

хмм, а разве команда не считается запросом? как это увязывается с первой фразой?
PM Skype   Вверх
neic
Дата 31.7.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Цитата(SickFxck @  31.5.2010,  21:51 Найти цитируемый пост)
Цитата(ziga @  13.5.2010,  15:44 )Запускаю сервак, и клиент отправляю клиентом сообщение всё нормально возвращает. Единственная проблема то что когда отправляю текст на русском языке возвращает "???????????????" в чём проблема?Проблема в System.Text.Encoding.ASCII.GetBytes(). Можешь попробовать UTF-8.

Нужно сделать так:
Код

System.Text.Encoding.Default.GetString()

Делал на VB.NET, но думаю разницы нет.
PM MAIL WWW ICQ Skype   Вверх
jonie
Дата 2.8.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

    * Можно такми способом получать таблицу из базы к примеру отправив клиентом select * from user получить ответ со списком пользователей в виде таблицы? если да то как лучше всего это сделать?
можно полученные результаты на сервере сериализовать например в DataSet и превратить его в XML, по которому и восстановить исходный dataset на клиенте


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Gleb
Дата 2.8.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 11.6.2005

Репутация: нет
Всего: 1



Цитата(nmn @  30.7.2010,  14:32 Найти цитируемый пост)
хмм, а разве команда не считается запросом? как это увязывается с первой фразой? 

SickFxck указывал на проблемы с безопасностью и типизацией и имел в виду передачу типа отчета (например в enum, flags или специальном классе), а не sql-запроса, этот отчет генерирующего.
И я с ним полностью согласен, потому что нужно четко понимать зачем это делается и не изобретаете ли вы Management Studio.


Цитата(ziga @  13.5.2010,  18:44 Найти цитируемый пост)
Можно такми способом получать таблицу из базы к примеру отправив клиентом select * from user получить ответ со списком пользователей в виде таблицы? если да то как лучше всего это сделать?

Вы можете передавать DataSet, но имейте в виду, что вам понадобится сжатие трафика, потому что сам по себе DataSet достаточно тяжеловесен.
Я рекомендую вам использовать WCF, с ним вам хотя бы не придется изобретать свои велосипеды в плане безопасности, обработки ошибок, сжатия трафика и много другого.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.