Socket pc and Android

586
25 июля 2021, 21:50

Вообщем на компьютере запускается сервер. К нему должен подключатся клиент с телефона через socket. Но почему-то не подключается. Дело не брендмауере т.к. есть другие приложения чаты на сокетах, и они подключаются к серверу на компьютере. Я учу Java SE и в андроид не шарю. Я на телефон скачивал приложение для теста Socket`a. Клиент на телефоне подключался к серверу на пк, но когда я запускаю свой клиент он не может подключится к серверу на пк. Порт открыт, дело в коде клиента, и я не понимаю в чем там проблема. Код Сервера:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server extends Thread{
    // порт, который будет прослушивать наш сервер
 static final int PORT = 8080;
    // список клиентов, которые будут подключаться к серверу
 private ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
public Server() {
            //запускаем поток сервера
    start(); 
}
    // отправляем сообщение всем клиентам
public void sendMessageToAllClients(String msg) {
    System.out.println(msg);
    for (ClientHandler o : clients) {
        o.sendMsg(msg);
    }
}
    // удаляем клиента из коллекции при выходе из чата
public void removeClient(ClientHandler client) {
    clients.remove(client);
}
public void run(){
    // сокет клиента, это некий поток, который будет подключаться к серверу
    // по адресу и порту
    Socket clientSocket = null;
    // серверный сокет
    ServerSocket serverSocket = null;
    try {
        // создаём серверный сокет на определенном порту
        serverSocket = new ServerSocket(PORT);
        System.out.println("Сервер запущен!");
        // запускаем бесконечный цикл
        while (true) {
            // таким образом ждём подключений от сервера
            clientSocket = serverSocket.accept();
            // создаём обработчик клиента, который подключился к серверу
            // this - это наш сервер
            ClientHandler client = new ClientHandler(clientSocket, this);
            clients.add(client);
            // каждое подключение клиента обрабатываем в новом потоке
            new Thread(client).start();
        }
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
    finally {
        try {
            // закрываем подключение
            clientSocket.close();
            System.out.println("Сервер остановлен");
            serverSocket.close();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }
  }
}

Код рукопожатия сервера

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class ClientHandler implements Runnable {
    // экземпляр нашего сервера
private Server server;
    // исходящее сообщение
private PrintWriter outMessage;
    // входящее собщение
private Scanner inMessage;
private static final String HOST = "localhost";
private static final int PORT = 8080;
    // клиентский сокет
private Socket clientSocket = null;
    // количество клиента в чате, статичное поле
private static int clients_count = 0;
    // конструктор, который принимает клиентский сокет и сервер
public ClientHandler(Socket socket, Server server) {
    try {
        clients_count++;
        this.server = server;
        this.clientSocket = socket;
        this.outMessage = new PrintWriter(socket.getOutputStream());
        this.inMessage = new Scanner(socket.getInputStream());
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
    // Переопределяем метод run(), который вызывается когда
    // мы вызываем new Thread(client).start();
@Override
public void run() {
    try {
        while (true) {
                            // сервер отправляет сообщение
            //if(clients_count==1){
            //    server.sendMessageToAllClients("SetName:admin");
            //}
            server.sendMessageToAllClients("Новый участник вошёл в чат!");
            server.sendMessageToAllClients("Клиентов в чате = " + 
clients_count);
            break;
        }
        while (true) {
            // Если от клиента пришло сообщение
            if (inMessage.hasNext()) {
                String clientMessage = inMessage.nextLine();
                                    // если клиент отправляет данное 
сообщение, то цикл прерывается и 
                                    // клиент выходит из чата
                if (clientMessage.equalsIgnoreCase("##session##end##")) { 
//TODO:
                    break;
                }
                                    // выводим в консоль сообщение (для 
теста)
                System.out.println(clientMessage);
                                    // отправляем данное сообщение всем 
клиентам
                server.sendMessageToAllClients(clientMessage);
            }
                            // останавливаем выполнение потока на 100 мс
            Thread.sleep(100);
        }
    }
    catch (InterruptedException ex) {
        ex.printStackTrace();
    }
    finally {
        this.close();
    }
}
    // отправляем сообщение
public void sendMsg(String msg) {
    try {
        outMessage.println(msg);
        outMessage.flush();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
    // клиент выходит из чата
public void close() {
            // удаляем клиента из списка
    server.removeClient(this);
    clients_count--;
    server.sendMessageToAllClients("Клиентов в чате = " + clients_count);
  }
}

код клиента на андроид

package com.example.client;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class MainActivity extends AppCompatActivity {
private static int MY_PERMISSION;
EditText text;
EditText vyv;
// адрес сервера
private static final String SERVER_HOST = "192.168.1.102";
// порт
private static final int SERVER_PORT = 8080;
// клиентский сокет
//private Socket clientSocket;
// входящее сообщение
private Scanner inMessage;
// исходящее сообщение
private PrintWriter outMessage;
// имя клиента
private String clientName = "";
// получаем имя клиента
public String getClientName() {
    return this.clientName;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    text = (EditText)findViewById(R.id.one);
    vyv = (EditText)findViewById(R.id.two);
}

public void conect(View v){

    try {
        // подключаемся к серверу
        Socket clientSocket = new Socket(SERVER_HOST, SERVER_PORT);
        inMessage = new Scanner(clientSocket.getInputStream());
        outMessage = new PrintWriter(clientSocket.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // бесконечный цикл
                while (true) {
                    // если есть входящее сообщение
                    if (inMessage.hasNext()) {
                        // считываем его
                        String inMes = inMessage.nextLine();
                        vyv.setText(inMes);
                    }
                }
            } catch (Exception e) {
            }
        }
    }).start();
}

public void sendText(View v){
    String massage = text.getText().toString();
    sendMsg(massage);
}

public void sendMsg(String msg) {
    // отправляем сообщение
    outMessage.println(msg);
    outMessage.flush();
}

}
Answer 1

На большинстве новых Android девайсах ip адрес/домен нельзя разрешать в UI потоке. Решением проблемы будет запуск клиентского кода в новом потоке.

READ ALSO
&lt;identifier&gt; expected

<identifier> expected

компилятор выдает

276
Совместить Freemarker и Vue.js

Совместить Freemarker и Vue.js

Есть MVC проект с использованием FreemarkerСтоит задача перевести на микросервисы

137
Для чего нужны методы с приставкой static?

Для чего нужны методы с приставкой static?

Как я понимаю они нужны что бы ограничить прототипирование и наследование функции или метода далее, я правильно понимаю?

281