(отредактировал мой вопрос) У меня есть работающий Android-клиент, который каждую секунду отправляет данные на сервер Java. Простой сервер Java получает данные непрерывно без проблем. Я хочу, чтобы клиент Android получил ответ от сервера для успешной передачи (данных с Android на сервер), и я хочу, чтобы этот ответ был помещен в текстовое представление. Я попытался вставить какой-то код, но не могу понять, как я могу получить и показать «ОК» в текстовом представлении клиента. (Кстати, в сетевой части реализована асинхронная задача)
public static void connect(String name, int port)
throws UnknownHostException, IOException
{
s = new Socket(name, port);
out = new PrintWriter(s.getOutputStream(), true);
input = new BufferedReader(new InputStreamReader(s.getInputStream()));
}
/**
* Sends a string message to the server.
*
* @param msg
* The message to be sent.
* @throws IOException
*/
public static void send(String msg) throws IOException
{
if (!s.isClosed() && msg != null)
{
out.println(msg);
out.close();
}
}
public static String receive() throws IOException
{
if (!s.isClosed())
{
result1 = input.readLine();
out.close();
input.close();
s.close();
}
return result1;
}
//Used for receiving notifications from the LocationManager when the location has changed
private class MyLocationListener implements LocationListener{
@Override
public void onLocationChanged(Location loc) {
String txt = "Latitude:" + loc.getLatitude() + "/nLongitude:" + loc.getLongitude();
Log.i("GeoLocation", "My current location is:\n " + txt);
tv.setText("My current location is:\n" + txt);
String msg=loc.getLongitude() + "\n" + loc.getLatitude() + "\n"
+ loc.getTime();
tv1 = (TextView) findViewById(R.id.textView2);
tv2 = (TextView) findViewById(R.id.textView3);
tv3 = (TextView) findViewById(R.id.textView4);
//determines if the location is within a designated area (rectangle)
double lat0 = 14.609794;
double long0 = 120.986018;
double lat1 = 14.608966;
double long1 = 120.986037;
double lat2 = 14.609031;
double long2 = 120.984991;
double lat3 = 14.609877;
double long3 = 120.985069;
double rel1 = (loc.getLongitude()- long0)*(lat1 - lat0)- ((loc.getLatitude()-lat0)*(long1-long0));
double rel2 = (loc.getLongitude()- long1)*(lat2 - lat1)- ((loc.getLatitude()-lat1)*(long2-long1));
double rel3 = (loc.getLongitude()- long2)*(lat3 - lat2)- ((loc.getLatitude()-lat2)*(long3-long2));
double rel4 = (loc.getLongitude()- long3)*(lat0 - lat3)- ((loc.getLatitude()-lat3)*(long0-long3));
// if yes, it will connect to server and send the location and timestamp
if (rel1 >= 0 && rel2 >= 0 && rel3 >= 0 && rel4 >= 0 )
{
tv1.setText("Location is inside the road network...");
new connectSend().execute(msg);
// new receiveString().execute();
}
else
{
tv1.setText("Current location is outside the road network");
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public class connectSend extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... msg) {
// TODO Auto-generated method stub
String result;
try
{
connect("192.168.10.191", 7774);
send(msg[0]);
result = "Sending is SUCCESSFUL ";
receive();
publishProgress(result1);
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
result = "Sending NOT SUCCESSFUL ";
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
result = "Sending NOT SUCCESSFUL ";
}
return result;
}
@Override
protected void onProgressUpdate(String... result1)
{
super.onProgressUpdate(result1);
tv3.setText(result1[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
tv2.setText(result);
}}
}
}
В случае необходимости ниже приведен простой сервер Java, который получает данные через сокет и отвечает, если прием прошел успешно
class ChatServer {
private static int port = 1234; /* port to listen on */
public static void main (String[] args) throws IOException {
class ClientConn implements Runnable {
private Socket client;
ClientConn(Socket client) {
this.client = client;
}
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
/* obtain an input stream to this client ... */
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
/* ... and an output stream to the same client */
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.err.println(e);
return;
}
String msg;
try {
/* loop reading messages from the client,
* output to stdin and send back an "OK" back */
while ((msg = in.readLine()) != null) {
System.out.println("Client says: " + msg);
out.println("OK");
}
} catch (IOException e) {
System.err.println(e);
}
}
}
ServerSocket server = null;
try {
server = new ServerSocket(port); /* start listening on the port */
} catch (IOException e) {
System.err.println("Could not listen on port: " + port);
System.err.println(e);
System.exit(1);
}
Socket client = null;
while(true) {
try {
client = server.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.err.println(e);
System.exit(1);
}
/* start a new thread to handle this client */
Thread t = new Thread(new ClientConn(client));
t.start();
}
}
}
Я понял это сейчас. У меня было два out.close () ;. Я удалил один из них, и теперь он работал:)