Как по socket удобно передавать строки?
От: matumba  
Дата: 12.12.06 10:44
Оценка:
Ребят, проблема — аховая, но почему-то очевидное решение не работает.
Есть сокет, есть простой протокол на строках. Нужно постоянно читать/передавать данные. Всё дело под C# 2.0.
Сначала попробовал сделать так:

Socket cli = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
cli.connect ....
NetworkStream NetStrm = new NetworkStream(cli, true);
StreamWriter wr = new StreamWriter(NetStrm);
wr.AutoFlush = true;
StreamReader rdr = new StreamReader(NetStrm);


Но любое чтение из rdr зависает в ожидании, хотя вторая сторона явно послала данные. (в данном случае это код клиента, но сервер почти такой же)
Вопрос: эта связка ридеров-вритеров в принципе не работает или я какой-нибудь долбаный флажок забыл?

PS
Одно время решал вопрос так: создавал ридер, а вместо вритера разлагал строку на байты и слал обычным Socket.Send. Но это некрасиво и уже как-то глупо смотрится.
Re: Как по socket удобно передавать строки?
От: nauro Украина  
Дата: 12.12.06 10:51
Оценка:
Здравствуйте, matumba, Вы писали:

M>Ребят, проблема — аховая, но почему-то очевидное решение не работает.

M>Есть сокет, есть простой протокол на строках. Нужно постоянно читать/передавать данные. Всё дело под C# 2.0.
M>Сначала попробовал сделать так:

M>
M>Socket cli = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
M>cli.connect ....
M>NetworkStream NetStrm = new NetworkStream(cli, true);
M>StreamWriter wr = new StreamWriter(NetStrm);
M>wr.AutoFlush = true;
M>StreamReader rdr = new StreamReader(NetStrm);
M>


M>Но любое чтение из rdr зависает в ожидании, хотя вторая сторона явно послала данные. (в данном случае это код клиента, но сервер почти такой же)

M>Вопрос: эта связка ридеров-вритеров в принципе не работает или я какой-нибудь долбаный флажок забыл?

M>PS

M>Одно время решал вопрос так: создавал ридер, а вместо вритера разлагал строку на байты и слал обычным Socket.Send. Но это некрасиво и уже как-то глупо смотрится.
Зачем вам ридер? Нужно просто читать байты посредством метода socket.Receive(byte [] bytes);, и преобразовывать их в строку таким вот образом:
byte [] bytes = new byte[size];
socket.Receive(bytes);
string s = System.Text.Encoding.GetEncoding([нужный вм енкодинг]).GetString(bytes);

посылать — по аналогии.
-----------------------------------------
тут может быть ваша реклама
Re: Как по socket удобно передавать строки?
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.12.06 15:49
Оценка:
Здравствуйте, matumba, Вы писали:
M>Но любое чтение из rdr зависает в ожидании, хотя вторая сторона явно послала данные. (в данном случае это код клиента, но сервер почти такой же)
M>Вопрос: эта связка ридеров-вритеров в принципе не работает или я какой-нибудь долбаный флажок забыл?
Попробуй порезать ридеру размер буфера:
StreamReader rdr = new StreamReader(NetStrm, Encoding.Default, true, 1);
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как по socket удобно передавать строки?
От: matumba  
Дата: 13.12.06 07:16
Оценка:
Здравствуйте, nauro, Вы писали:

N>Зачем вам ридер? Нужно просто...


Если ридеры делают, значит это кому-нибудь нужно? Прелесть (грамотной) библиотеки в том и состоит,
что не нужно каждый раз изобретать обработчик битов, а использовать готовые классы.
В данном случае крайне убогая реализация класса Socket должна компенсироваться высокоуровневыми читалками/писалками.
Чего я, к сожалению, не наблюдаю
Re: Как по socket удобно передавать строки?
От: Аноним  
Дата: 12.12.06 16:18
Оценка:
Imel vvidu chto tak glupo
string comm="aaaaaaaavvvdddddd";
string retValue="";
byte[] byData = System.Text.Encoding.UTF8.GetBytes(comm);
mySocket.Send(byData,0,byData.Length, SocketFlags.None);
byte [] buffer = new byte[102400];
int iRx = 0;
//iRx = mySocket.Receive(buffer, 0, mySocket.Available, SocketFlags.None);//iRx=0 , buffer — null
iRx = mySocket.Receive(buffer);//iRx=0 buffer — null
char[] chars = new char[iRx];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
StringBuilder szData = new StringBuilder();
szData.Append(chars);
//retValue = Encoding.UTF8.GetString(buffer);
res = szData.ToString();
return res;


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.