Как добавить поддержку SSL для простого веб-сервера Android, написанного на JavaAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как добавить поддержку SSL для простого веб-сервера Android, написанного на Java

Сообщение Anonymous »

Я написал минималистичный веб-сервер HTTP на Java. Приложение отлично работает, например, на моем телефоне Android. Когда мой телефон подключен к локальной сети, я могу просто запустить приложение и использовать браузер, работающий на моем компьютере, для подключения к нему. В зависимости от IP-адреса моего телефона URL-адрес может быть, например, http://192.168.1.100:8082/test.
Код состоит в основном из двух классов. Тот, который ожидает подключения:

Код: Выделить всё

public class ListenerThread extends Thread
{
public void run()
{
try
{
ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(8082);
for (;;)
{
Socket connected = serverSocket.accept();
new ClientThread(connected).start();
}

} catch (IOException e)
{
}
}
}
И еще один класс, который обрабатывает эти соединения:

Код: Выделить всё

public class ClientThread extends Thread
{
private final Socket socket;

public ClientThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());

byte[] buffer = new byte[2000];

for(;;)
{
int read = in.read(buffer, 0, buffer.length);
if (read = 4 && recData.substring(0, 4).compareToIgnoreCase("GET ") == 0)
{
reply(out,"Moin Moin");
}
}

in.close();
out.close();
socket.close();

} catch (IOException e)
{
}
}

private void reply(DataOutputStream output, String content)
{
SimpleDateFormat gmtFormat = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss 'GMT'", Locale.getDefault());
gmtFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8), false);
pw.append("HTTP/1.1 200\r\n");

pw.append("Content-Type: text/plain; charset=utf-8\r\n");
pw.append("Access-Control-Allow-Origin: *\r\n");
pw.append("Date: ").append(gmtFormat.format(new Date())).append("\r\n");
pw.append("Connection: keep-alive\r\n");
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
pw.append("Content-Length: ").append(String.valueOf(bytes.length)).append("\r\n");
pw.append("Server: MoinMoin\r\n");
pw.append("\r\n");
pw.flush();

try
{
output.write(bytes);

} catch (IOException e)
{
}
}
}
Чтобы запустить прослушиватель, все, что мне нужно сделать, это:

Код: Выделить всё

    private ListenerThread listener = null;

[..]

listener = new ListenerThread();
listener.start();
Пока все хорошо.
Но теперь я хочу обновить его до https, потому что браузеры в наши дни не любят незашифрованные соединения. Простое использование SSLServerSocketFactory вместо ServerSocketFactory и т. д. не поможет. Должно быть больше. Браузер сообщает мне, что соединение небезопасно. Я думаю, он прав. Мне нужно как-то предоставить сертификат. Возможно, для игры достаточно самоподписанного сертификата. Но как мне это применить? Любой намек очень приветствуется.
Пожалуйста, не беспокойтесь о том, что представленный код отвечает на каждый запрос get одной и той же фразой, это не имеет значения для моего вопроса о включении запросов https.
Обновление: похоже, никто не думает, что поток, предлагающий сервер https, может быть полезен... хотя другие среды поддерживают это более или менее готово (python) или включают в себя шаблоны проектов для аналогичных идей (Visual Studio)...

Подробнее здесь: https://stackoverflow.com/questions/797 ... en-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»