Dzięki:)
Porównałem kod z linku, który podałeś z tym
http://www.xyzws.com/Javafaq/how-to-use-ht...-web-server/139 i generalnie:
1) nie wiem, dlaczego os.flush() miałby być ryzykowny
2) co on właściwie za response czyta, skoro wysyłam dane przy pomocy POST, a nie czytam z serwera
3) po co linijka "BufferedReader rd = new BufferedReader(nwe InputSreamerReader(is));" w kodzie z xyzws.com
4) czy setRequestPropery "User-Agent" oraz "Content-Length" są konieczne
Znalazłem w jakiejś książce "wyslij.php - kod PHP odbierający pliki wysłane przez formularz HTML", wkrótce to przeczytam. Zakładam, że odbiera się z MIDletu podobnie jak wysłane przez formularz.
Miałbym też pytanie z trochę innej beczki - czy mógłbyś zasugerować od czego zacząć, jeśli chciałbym w MIDlecie na komórce zainicjować połączenie głosowe z serwerem - tzn. żeby użytkownik komórki uruchamiał MIDlet, wybierał opcję "rozpocznij połączenie", komórka rozpoczynała połączenie głosowe z serwerem i przesyłała dane mówione przez użytkownika w formie pliku dźwiękowego na serwer, a serwer w czasie rzeczywistym na podstawie analizy mowy przy użyciu open-source'owego projektu rozpoznawania mowy Sphinx4 wysyłał w pliku tekstowym rozpoznaną mowę? Myślałem o użyciu GSM/GPRS w celu wysłania dźwięku na serwer. Generalnie to moje pytanie dotyczy: 1) jak wysłać dane głosowe na serwer, 2) jak równocześnie otrzymywać dane w postaci plików tekstowych z serwera (z lekkim opóźnieniem, rzecz jasna)?
Pozdrawiam:)
DODANE 27-09-2009Dzięki, Erix, za Twoje odpowiedzi :-).
OK, ponowię swoje pytanie, ale tym razem je streszczę + umieszczę kod obu plików :-).
Otóż chciałbym wysłać mały plik tekstowy z MIDletu na komórce przy użyciu httpconnection na serwer, gdzie jest skrypt PHP.
Gdyby to było wysłane z przeglądarki w PHP na serwer w PHP to kod wysyłający byłby taki:
Kod
<input name="usersfile" type="file">
zaś odbierający taki:
Kod
&usersfile = $HTTP_POST_FILES['usersfile']['tmp_name'];
W wypadku MIDletu i PHP, wysyłający jest taki:
Kod
HttpConnection conn = null;
String url = "http://87.205.xx.xx/datareceiver.php";
i odbierający jest taki:
Kod
&usersfile = $HTTP_POST_FILES['!!!!!HERE!!!!!']['tmp_name'];
W tym drugim wypadku po prostu nie wiem, co wpisać w miejsce "!!!!!HERE!!!!!".
Zakładam, że ten skrypt PHP na serwerze jest wykonywany za każdym razem, gdy wywołam funkcję "wyślij" na MIDlecie, która łączy się z
http://87.205.xx.xx/datareceiver.php.
Drugie pytanko - wydaje mi sie, że dużo prostsze :-). Nie wiem, po co te całe znaczniki html, body itd., skoro ja nie chcę żadnego tekstu na serwerze wywoływać przy pomocy przeglądarki. Jak zrobić tak, żeby skrypt po prostu się wykonał i wyłączył na serwerze, zapisał coś tam do bazy danych i tyle, niczego nie wyświetlał mi w przeglądarce?
A tutaj kod wysyłającego MIDletu:
Kod
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class myMidletSendData extends MIDlet
{
//W tej zmiennej zapiszę obiekt pobrany metodą Display.getDisplay()
private Display display;
//Wewnętrzna klasa Ekran rozszerzająca klasą Canvas
private class Ekran extends Canvas implements CommandListener
{
String label = "Tekst domyślny";//tekst do wypisania na ekranie
int ScreenWidth, ScreenHeight; //szerokość i długość ekranu
Command opcjawyjscie = new Command("Wyjście", Command.EXIT, 1);
//Konstruktor wewnętrznej klasy Ekran
public Ekran(String inparam)
{
//
label = inparam;
//Pobieram wysokość i szerokość dostępnego ekranu:
ScreenWidth = getWidth();
ScreenHeight = getHeight();
//Dodaję komendę:
addCommand(opcjawyjscie);
setCommandListener(this);
}
public void commandAction(Command c, Displayable d)
{
if (c == opcjawyjscie)
{
destroyApp(true);
notifyDestroyed();
}
}
/** W matodzie paint() definiujemy wygląd elementu
*/
protected void paint(Graphics g)
{
//Namalowanie tła:
g.setColor(0xffffff); //zmiana aktualnego koloru
//Namalowanie wypełnionego aktualnym kolorem prostokąta:
g.fillRect(0, 0, ScreenWidth, ScreenHeight);
//Współrzędne w rogach ekranu:
g.setColor(0x000000);
g.drawString("(0,0)", 0, 0, g.TOP|g.LEFT);
g.drawString("(" + ScreenWidth + "," + ScreenHeight
+ ")", ScreenWidth, ScreenHeight, g.BOTTOM|g.RIGHT);
//Tekst na środku ekranu:
g.setColor(0x770000);
g.drawString(label, ScreenWidth/2, ScreenHeight/2,
g.HCENTER|g.TOP);
}
}
public myMidletSendData() //konstruktor MIDlet-u
{
try {
sendTextFile("123456789012 234567890123 end");
}
catch (IOException e) {
System.out.println("IOException " + e.toString());
}
}
public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(new Ekran("Witaj w aplikacji!"));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void sendTextFile(String name) throws IOException
{
System.out.println("Wywolano sendTextFile");
HttpConnection conn = null;
String url = "http://87.205.18.184/datareceiver.php";
String agent = "Profile/MIDP-1.0 Configuration/CLDC-1.0";
String rawData = "vagons=" + name;
String type = "application/x-www-form-urlencoded";
//String encodedData = encode( rawData ); // user-supplied
String encodedData = rawData; //z powodu bledu kompilacji nie bede
//kodowal rawData - kodowanie rzekomo potrzebne z powodu typu x-www-form-urlencoded
try {
conn = (HttpConnection) Connector.open( url );
conn.setRequestMethod( HttpConnection.POST );
conn.setRequestProperty( "User-Agent", agent );
conn.setRequestProperty( "Content-Type", type );
conn.setRequestProperty( "Content-Length", "encodedData.length()" );
//http://forum.vingrad.ru/act-Print/client/html/f-114/t-185266.html <- wziac w cudzyslow
getConnectionInformation(conn); //pozniej mozna usunac to
//wywolanie jak i sama funkcje getConnectionInformation
OutputStream os = conn.openOutputStream();
os.write( encodedData.getBytes() );
int rc = conn.getResponseCode();
// ... process it
//System.out.println("ResponseCode " + rc.toString());
//powyzej wyskakiwal blad: int cannot be dereferenced
System.out.println("ResponseCode " + rc);
}
catch( IOException e ) {
// handle the error here
System.out.println("IOException " + e.toString());
}
//wyrzucilem finally bo bylo za duzo bledow kompilacji w zwiazku z is oraz conn
}
/*** After setup, attributes of the HttpConnection object can be retrived using
various get methods.
***/
void getConnectionInformation(HttpConnection hc) {
System.out.println("POCZATEK GET CONNECTION INFORMATION");
System.out.println("Request Method for this connection is " + hc.getRequestMethod());
System.out.println("URL in this connection is " + hc.getURL());
System.out.println("Protocol for this connection is " + hc.getProtocol()); // It better be HTTP:)
System.out.println("This object is connected to " + hc.getHost() + " host");
System.out.println("HTTP Port in use is " + hc.getPort());
System.out.println("Query parameter in this request are " + hc.getQuery());
System.out.println("KONIEC GET CONNECTION INFORMATION");
}
}
i odbierającego PHP:
Kod
//datareceiver.php:
<html>
<head>
<title> Wysylanie... </title>
</head>
<body>
<h1>Wysylanie pliku...</h1>
<?php
$plikuzytkownika = $HTTP_POST_FILES['plikuzytkownika']['tmp_name'];
$plikuzytkownika_name = $HTTP_POST_FILES['plikuzytkownika']['name'];
$plikuzytkownika_size = $HTTP_POST_FILES['plikuzytkownika']['size'];
$plikuzytkownika_type = $HTTP_POST_FILES['plikuzytkownika']['type'];
$plikuzytkownika_error = $HTTP_POST_FILES['plikuzytkownika']['error'];
if ($plikuzytkownika_error > 0)
{
echo 'Problem: ';
switch ($plikuzytkownika_error)
{
case 1: echo 'Rozmiar pliku przekroczyl wartosc upload_max_filesize'; break;
case 2: echo 'Rozmiar pliku przekroczyl wartosc max_file_size'; break;
case 3: echo 'Plik wyslany tylko czesciowo'; break;
case 4: echo 'Nie wyslano zadnego pliku'; break;
}
exit;
}
if ($plikuzytkownika_type != application/x-www-form-urlencoded)
{
echo 'Problem: plik nie jest odpowiedniego typu';
exit;
}
$lokalizacja = '/wyslane/'.$plikuzytkownika_name;
if (is_uploaded_file($plikuzytkownika))
{
if (!move_uploaded_file($plikuzytkownika, $lokalizacja))
{
echo 'Problem: Plik nie moze byc skopiowany do katalogu';
exit;
}
}
else
{
echo 'Problem: mozliwy atak podczas wysylania pliku. Nazwa pliku: '.$plikuzytkownika_name;
exit;
}
echo 'Plik wyslany<br /><br />';
$wp = fopen($lokalizacja, 'r');
$zawartosc = fread($wp, filesize($lokalizacja));
fclose($wp);
echo 'Podglad zawartosci wyslanego pliku:<br /><hr />';
echo $zawartosc;
echo '<br /><hr />';
?>
</body>
</html>
Pozdrawiam :-)