Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.212.26.248] |
|
Сообщ.
#1
,
|
|
|
На дельфи есть ServerSocket1
В яве реализован клиент с клиента отправляется текст и сервер принемает а с сервера пытаюсь for x:=0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[x].SendText('Hello'); клиент не принемает вот код клиента // Start the thread for sending messages - see Sender's main // comment for explanation sender = new Sender(os); // Loop forever, receiving data while (true) { StringBuffer sb = new StringBuffer(); int c = 0; while (((c = is.read()) != '\n') && (c != -1)) { sb.append((char)c); } if (c == -1) { break; } // Display message to user si.setText("Message received - " + sb.toString()); } stop(); si.setText("Connection closed"); f.removeCommand(sendCommand); } catch (ConnectionNotFoundException cnfe) { Alert a = new Alert("Client", "Please run Server MIDlet first", null, AlertType.ERROR); a.setTimeout(Alert.FOREVER); a.setCommandListener(this); display.setCurrent(a); } catch (IOException ioe) { if (!stop) { ioe.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } |
Сообщ.
#2
,
|
|
|
Ктонибудь скажите как решить
|
Сообщ.
#3
,
|
|
|
А какая проблема? Ошибка или что? Что значит "не принимает"?
До куска while (((c = is.read()) != '\n') && (c != -1)) { sb.append((char)c); } Это первое. Второе - почему Вы думаете, что когда клиент получит всю строку Hello, он выйдет из этого цикла? А где, собственно, сервер передаёт '\n', которого ждёт клиент? Добавлено И стрим тоже не порушится, то есть -1 не вернётся, по крайней мере, пока таймаут не пройдёт. Добавлено Да и с кодировками будут проблемы при таком пересылании сообщений. Ну это уже на будущее. |
Сообщ.
#4
,
|
|
|
dark_barker может уже тогда есть готовый вариант? где нати
|
Сообщ.
#5
,
|
|
|
krogal, не, ну причём тут готовый вариант. Готовых то полно.
Цитата dark_barker @ Я так и не понял - если на сервере поставить перенос строкА где, собственно, сервер передаёт '\n', которого ждёт клиент? ServerSocket1.Socket.Connections[x].SendText('Hello\n'); |
Сообщ.
#6
,
|
|
|
Цитата dark_barker @ ServerSocket1.Socket.Connections[x].SendText('Hello\n'); тоже не принемает while (((c = is.read()) != '\n') && (c != -1)) { sb.append((char)c); si.setText("Mess - " + sb.toString()); } но каждоее сдедующее принятое приплюсовывается к предыдущему Добавлено И с кодировкой проблемы... |
Сообщ.
#7
,
|
|
|
krogal, так проблема то в чём?
С кодировкой понятно что будут проблемы, сразу и сказал. Потому что сервер, ясно понятно НЕ шлёт в ююникоде-16. А это "(char)c" подразумевает неприятности в даннов виде. Надо принимать по byte в байтовый буффер, а потом делать строку с кодировкой windows-1251. |
Сообщ.
#8
,
|
|
|
Цитата dark_barker @ Надо принимать по byte в байтовый буффер как это сделать? |
Сообщ.
#9
,
|
|
|
Ну, вообще, is.read() возвращает БАЙТ, а не СИМВОЛ. Следовательно, логично предположить, что для всех других кодировок это не пройдёт. То есть, сервер посылает в windows-1251, а клиент пытается эти коды транслировать в Вашем примере напрямую в ДВУХБАЙТОВЫЙ юникод.
Стало быть, надо копить вывод в массиве byte[]massiv, класть их туда так: (byte)c. А потом делать что-то типа String str = new String(massiv, "windows-1251"); |
Сообщ.
#10
,
|
|
|
У меня была когдадато така проблема, проблема решилась следующим способом, надо отправлять нужнуй тебе текст c кодовым символом С сервера который написан на делфи через компонент сервер сокет, что то типа того : ServerSockets.connections[0].Socket.SendText('привет'+#$D+#$A);
В java это значение '\n' а в делфи это #$D+#$A и будет у тебя все пучком...! |
Сообщ.
#11
,
|
|
|
Действительно проблема была с '\n' я вместо него назначил другой символ и все ок. Но теперь проблема с кодировкой как реализовать пример
String str = new String(massiv, "windows-1251"); |
Сообщ.
#12
,
|
|
|
dark_barker Спасибо все получилось.
|