клиент-серверное приложение Android

Ответить
_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

клиент-серверное приложение Android

Сообщение _ILYA_ » 22 дек 2014, 21:36

дайте ссылку где есть такое. Не просто java клиент сервер а именно чтоб на android было. гугление особо не помогло.
вот кое что сам пытался сделать.
по чему-то приложение не закрывается кнопкой back. после нажатия на нее, через некоторое время всплывает окно "приложение не отвечает. подождать? , принудительно остановить?
тестировал на реальном устройстве android 2.3.6
сервер
[syntax=java5]package com.example.test_server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{
int n_port = 7656;
TextView tv;
Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView)findViewById(R.id.tv);
tv.append('\n' + "N port " + n_port);

handler = new Handler();

Thread t = new Thread(new Runnable()
{
public void run()
{
try
{
TimeUnit.MILLISECONDS.sleep(500);
handler.post(_run);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
});

t.start();
}

Runnable _run = new Runnable()
{
public void run()
{
tv.append('\n' + "ServerSocket");
try
{
ServerSocket server = null;
Socket client = null;

server = new ServerSocket(n_port);
client = server.accept();

tv.append('\n' + "Got client");

PrintWriter out = null;
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream());

String input, output;

while((input = in.readLine()) != null)
{
if(input.equalsIgnoreCase("exit"))
break;
// Ответ клиенту
out.println(input);
tv.append('\n' + input);
}
out.close();
in.close();
client.close();
server.close();
tv.append('\n' + "Server closed");
}
catch(IOException e)
{
tv.append('\n' + "ERROR" + '\n' + e.getMessage());
}
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

} [/syntax]
скорее всего это криво. подскажите как надо.
мне на с++ как то проще кодить
на java кодил только в андройде. может там свой какие то особенности?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: клиент-серверное приложение Android

Сообщение KamiSempai » 23 дек 2014, 17:24

Handler по умолчанию шлет сообщения в UI поток, поэтому после запуска все виснет. На 4 андроиде такой код вообще бы не запустился.

Тут нет необходимости использовать Handler. Вместо вызова handler.post(_run), нужно перенести всю работу с сетью, из _run, в поток t.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: клиент-серверное приложение Android

Сообщение _ILYA_ » 23 дек 2014, 20:01

Точно, проверил на android 4 не идет.
Только мне не понятно -как без Handler обойтись. Как мне обновлять TextView ?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: клиент-серверное приложение Android

Сообщение KamiSempai » 23 дек 2014, 21:27

А вот для изменения UI нужно использовать Handler. Только он должен выполнять только тот код, что работает с UI.
В вашем варианте лучше использовать не Runnable а Message.

Вот пара уроков про это:
http://startandroid.ru/ru/uroki/vse-uro ... henie.html
http://startandroid.ru/ru/uroki/vse-uro ... ijami.html
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: клиент-серверное приложение Android

Сообщение _ILYA_ » 24 дек 2014, 21:09

кое что переделал. Теперь приложение запускается
сервер
[syntax=java5]package com.example.test_server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{
int n_port = 6778;
TextView tv;
Handler handler;
String str_info = "";
ServerSocket servers = null;
Socket fromclient = null;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView)findViewById(R.id.tv);
tv.append('\n' + "N port " + n_port);
handler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
tv.append(msg.obj.toString());
}
};

// Подключаемся к порту
try
{
servers = new ServerSocket(n_port);
tv.append('\n' + "create server socket port: " + n_port);
}
catch(IOException e)
{
tv.append('\n' + "Error " + e.getMessage());
}

new Thread(new Runnable()
{
public void run()
{
try
{
TimeUnit.MILLISECONDS.sleep(1500);

Message msg;

msg =
handler.obtainMessage(0, '\n' + "Waiting for a client ...");
handler.sendMessage(msg);

fromclient = servers.accept();

msg =
handler.obtainMessage(0, "Client connected");
handler.sendMessage(msg);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
Message msg =
handler.obtainMessage(0, '\n' + e.getMessage());
handler.sendMessage(msg);
e.printStackTrace();
}
}
}).start();
}
} [/syntax]
клиент
[syntax=java5]package com.example.test_client;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{
Socket client = null;
int n_port = 6778;
TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView)findViewById(R.id.tv);
tv.setText("Test client port: " + n_port);

try
{
client = new Socket("0.0.0.0", n_port);
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
tv.append('\n' + "Error: " + e.getMessage());
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
tv.append('\n' + "Error: " + e.getMessage());
e.printStackTrace();
}
}
} [/syntax]

теперь другая проблема. Клиент выбрасывает исключение /0.0.0.0:6778 - Connection refused
Тестировал на реальных устройствах. Сервер android 4, клиент android 2.3

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: клиент-серверное приложение Android

Сообщение KamiSempai » 25 дек 2014, 16:13

Я с сокетами не работал, но возможно вы не правильно указываете адрес. Например, в данной ситуации, возможно, лучше подойдет 127.0.0.1.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить