Вообщем на компьютере запускается сервер. К нему должен подключатся клиент с телефона через 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();
}
}
На большинстве новых Android девайсах ip адрес/домен нельзя разрешать в UI потоке. Решением проблемы будет запуск клиентского кода в новом потоке.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть MVC проект с использованием FreemarkerСтоит задача перевести на микросервисы
Как я понимаю они нужны что бы ограничить прототипирование и наследование функции или метода далее, я правильно понимаю?