Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 27.11.2015, 07:29   #16
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Сетевое программирование

Можно твою функцию чтения сделать асинхронной - завернуть в обёртку, тогда получение не будет блокировать прогу.
static public async Task Boolean readSocket()
При этом нужно синхронизировать процесс обработки полученной строки c контекстом текущего потока (наверное).
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (27.11.2015)
Старый 27.11.2015, 09:21   #17
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Сетевое программирование

Блокировка не важна. Вопрос чем заменить DataAvailable - например пришло сразу две строки, одну прочитали, DataAvailable сбросилось, вторая будет висеть и не прочитается пока не придет что-нибудь еще...
Что-то мне подсказывает, что от ReadLine() придется отказаться.
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 27.11.2015, 12:00   #18
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Сетевое программирование

Можно так: читать сокет в отдельном потоке в цикле. прочитанные строки отправлять в обработчик EventHandler.

public EventHandler<string> OnReadLine;

new Thread() {// псевдокод, не помню точный синтаксис

    while (net_stream.DataAvailable) { 
        tcp_packet = socket_reader.ReadLine(); 
        if (OnReadLine != null)
            OnReadLine(this, new SocketEventArgs(tcp_packet));
    }

}.start();

public class SocketEventArgs : EventArgs {

    public string line;

    public SocketEventArgs(string s) {
        line = s;
    }
}
в итоге можно использовать полученные из сокета строки любым количеством слушателей.

socketWrapper.OnReadLine += (sender, args) => {
    // что-то делаем со строчками
}
socketWrapper - в принципе, можно и через статический доступ, у тебя же этот класс щас статический.

отправку данных можно тоже делать в отдельном потоке, выгребая все команды из списка-на-отправку.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (28.11.2015)
Старый 27.11.2015, 14:34   #19
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сетевое программирование

Проблема вероятнее в том, что сервер не отправляет данные строки.
Попробуй установить на обоих сторонах вот этот флаг в True:
https://msdn.microsoft.com/ru-ru/lib...vs.110).asp x
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (28.11.2015)
Старый 27.11.2015, 20:14   #20
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Сетевое программирование

Если как ты написал "блокировка не важна", то вся эта хрень с DataAvailable вообще не нужна.

var ns = tcpClient.GetStream();
var rdr = new StreamReader(ns);

var line = rdr.ReadLine();
while (line != null) {
    //обрабатываем строку...

    line = rdr.ReadLine();
}
rdr.ReadLine() будет блокировать выполнение пока либо не прочитает строку либо не наткнется на конец потока.

Если тебе нужно асинхронно принимать данные по сети и "делить на строки", то подход нужен совсем другой - 1 поток просто всегда читает данные из tcpClient и записывает в буффер, 2 поток (можно и в основном), читает данные из буффера и делит на строки, если там какой-то кусок "неполный", то его надо оставить в буффере до тех пор пока остальное не придет. На самом деле и чтение из потока и обработку данных можно тоже в одном потоке делать, просто так делать не принято (хоть и будет работать)
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (28.11.2015)
Старый 28.11.2015, 11:26   #21
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Сетевое программирование

Всем спасибо.
В итоге сделал так, вроде работает без ошибок:

static byte[] bytes = new byte[8192];

tcp_socket = new TcpClient(hostport);
net_stream tcp_socket.GetStream();

static public 
Boolean readSocket() 

    while (
net_stream.DataAvailable) {
        
int len net_stream.Read(bytes0bytes.Length);
        
read_buffer += Encoding.UTF8.GetString(bytes,0,len);
    }

    if (
read_buffer.Length!=0)
    {
        
//Разделение на строки
        
int i read_buffer.IndexOf("\n");
        if (
> -1) {
            
tcp_values read_buffer.Substring(01));
            
read_buffer read_buffer.Substring(1);
            return 
true;
        }
    }
    return 
false;

__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com