Не работает сервер и клиент на Android

160
26 июля 2019, 04:40

Нашёл примеры сервера и клиента на android, но почему-то примеры не работают, хотя все верно. Я подумал, что возможно проблема связана с тем, что я запускаю оба приложения на эмуляторах. Можете подсказать с чем это может быть связано?

В логах клиента пишет: Connection refused

Использую локальный адрес: 192.168.1.45

Код сервера:

package com.example.omen.serverforcofe;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Created by Girish Bhalerao on 5/4/2017.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    final Handler handler = new Handler();
    private Button buttonStartReceiving;
    private Button buttonStopReceiving;
    private TextView textViewDataFromClient;
    private boolean end = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonStartReceiving = (Button) findViewById(R.id.btn_start_receiving);
        buttonStopReceiving = (Button) findViewById(R.id.btn_stop_receiving);
        textViewDataFromClient = (TextView) findViewById(R.id.tv_data_from_client);
        buttonStartReceiving.setOnClickListener(this);
        buttonStopReceiving.setOnClickListener(this);
    }
    private void startServerSocket() {
        Thread thread = new Thread(new Runnable() {
            private String stringData = null;
            @Override
            public void run() {
                try {
                    ServerSocket ss = new ServerSocket(9002);
                    while (!end) {
                        //Server is waiting for client here, if needed
                        Socket s = ss.accept();
                        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        PrintWriter output = new PrintWriter(s.getOutputStream());
                        stringData = input.readLine();
                        output.println("FROM SERVER - " + stringData.toUpperCase());
                        output.flush();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        updateUI(stringData);
                        if (stringData.equalsIgnoreCase("STOP")) {
                            end = true;
                            output.close();
                            s.close();
                            break;
                        }
                        output.close();
                        s.close();
                    }
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
    private void updateUI(final String stringData) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                String s = textViewDataFromClient.getText().toString();
                if (stringData.trim().length() != 0)
                    textViewDataFromClient.setText(s + "\n" + "From Client : " + stringData);
            }
        });
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start_receiving:
                startServerSocket();
                buttonStartReceiving.setEnabled(false);
                buttonStopReceiving.setEnabled(true);
                break;
            case R.id.btn_stop_receiving:
                //stopping server socket logic you can add yourself
                buttonStartReceiving.setEnabled(true);
                buttonStopReceiving.setEnabled(false);
                break;
        }
    }
}

Код клиента:

package com.example.omen.clientforcofe;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
 * Created by Girish Bhalerao on 5/4/2017.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView mTextViewReplyFromServer;
    private EditText mEditTextSendMessage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button buttonSend = (Button) findViewById(R.id.btn_send);
        mEditTextSendMessage = (EditText) findViewById(R.id.edt_send_message);
        mTextViewReplyFromServer = (TextView) findViewById(R.id.tv_reply_from_server);
        buttonSend.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send:
                sendMessage(mEditTextSendMessage.getText().toString());
                break;
        }
    }
    private void sendMessage(final String msg) {
        final Handler handler = new Handler();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //Replace below IP with the IP of that device in which server socket open.
                    //If you change port then change the port number in the server side code also.
                    Socket s = new Socket("192.168.1.45", 9002);
                    OutputStream out = s.getOutputStream();
                    PrintWriter output = new PrintWriter(out);
                    output.println(msg);
                    output.flush();
                    BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
                    final String st = input.readLine();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            String s = mTextViewReplyFromServer.getText().toString();
                            if (st.trim().length() != 0)
                                mTextViewReplyFromServer.setText(s + "\nFrom Server : " + st);
                        }
                    });
                    output.close();
                    out.close();
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}
Answer 1
  1. попробуйте запустить сервер на реальном устройстве, и с эмулятора (клиента) подключится. Также можно будет посмотреть IP устройства.
  2. попробуйте на стороне сервера "пробить" его IP, может там 127.0.0.1?
  3. проверьте что в программе есть доступ в Internet (android.permission.INTERNET)
READ ALSO
Помогите сделать календарь

Помогите сделать календарь

Всем привет, хочу сделать календарь на Android чтобы нужные даты были в кружечкахМне нужно разобрать лишь с тем как сделать их в кружечках, дальше...

158
Ошибка “main metod is not static in class”

Ошибка “main metod is not static in class”

Изучаю Java и столкнулся с проблемой запуска программыЯ убрал static из класса main, т

110
Spring не использует прокси

Spring не использует прокси

В чужом проекте столкнулся со странной работой спринга, которой не могу найти объясненияПерестало выполняться сохранение в бд, пошёл посмотреть...

126
Android NSD. Как отправить сообщение от сервера ко всем, подключенным к нему клиентам

Android NSD. Как отправить сообщение от сервера ко всем, подключенным к нему клиентам

В одном месте мне нужно передать строку от сервера ко всем клиентам, которые к нему подключеныЯ могу отправить строку от клиента к серверу,...

135