Java - подключение к ServerSocket через браузер / URL - PullRequest
2 голосов
/ 18 июля 2011

Я пишу часть программного обеспечения, и я не могу использовать сокет для подключения к Java-приложению с помощью ServerSocket.

Я подумал, что попробую с URL-соединением, так как можно определить, к какому порту подключаться

например:

127.0.0.1:62666

У меня есть серверное приложение, которое прослушивает соединения и записывает входные данные в jTextArea. При подключении к серверу (127.0.0.1:62666) через браузер выводит:

GET / HTTP/1.1
GET /favicon.ico HTTP/1.1

У меня есть другое приложение для подключения к ServerSocket через соединение URL:

try{
        URL url = new URL("http://127.0.0.1:62666");
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);
        connection.connect();
        PrintWriter writer = new PrintWriter(connection.getOutputStream());
        writer.print("Hello");
        System.out.println("should have worked");
        writer.flush();
        writer.close();
    }catch(IOException e){
        e.printStackTrace();
    }

Распечатывает сообщение «должно было сработать», но ничего не записывает в jTextArea сервера. Код для серверного приложения выглядит следующим образом:

try{

        ServerSocket serverSock = new ServerSocket(62666);

        while(doRun){
            Socket sock = serverSock.accept();
            BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            PrintWriter writer = new PrintWriter(sock.getOutputStream());

            InfoReader.gui.writeToTextArea(reader.readLine() + " From IP: " + sock.getInetAddress() + "\n");
            writer.println("Testing123");

            writer.close();

            reader.close();

        }
    }catch(IOException e){
        e.printStackTrace();
    }

Примечание: при подключении через браузер отображается текст «Testing123».

Поэтому мне интересно, как это сделать так, как я пытаюсь или, возможно, прочитать URL-адрес, через который был получен доступ к ServerSocket, чтобы я мог получить к нему доступ через URL-адрес при передаче его аргументов (в URL-адресе).

Надеюсь, это имеет смысл:)

Спасибо, Майк.

Ответы [ 4 ]

1 голос
/ 25 ноября 2015

Есть один очень хороший пример :

public class SimpleHTTPServer {
    public static void main(String args[]) throws IOException {
        ServerSocket server = new ServerSocket(8080);
        while (true) {
            try (Socket socket = server.accept()) {
                Date today = new Date();
                String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
                socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
            }
        }
    }
}

Перейдите на http://127.0.0.1:8080/ из браузера, и вы получите текущую дату.

1 голос
/ 18 июля 2011

Я не могу точно понять, что случилось.В этом OutputStream есть что-то смешное.Добавьте

((HttpURLConnection) connection).getResponseCode();

где-то после connect() и до close(), и вы должны увидеть что-то другое, если не то, что ожидаете.

Возможно, вместо попытки использовать HTTP ввзломать, вы должны просто перейти на полный HTTP.Используйте HTTP от клиента, как вы уже есть, и настройте встроенный HTTP-сервер на сервере.Есть несколько вариантов на выбор, которые буквально занимают всего несколько строк: Grizzly , Simple Framework или Jetty , например.

0 голосов
/ 18 июля 2011
writer.println("Hello");

Вы не отправляете новую строку.Кроме того, ваш след должен был работать не в том месте.Должно быть после flush ().

Также вы не читаете ответ.

Также сервер будет отображать только POST ... или PUT ..., а не строкувы отправляетеТак что это никогда не сработает, если вы (а) не сделаете сервер HTTP-ориентированным или (б) не избавитесь от этого безумного ограничения, что вы не можете использовать Socket. Почему вы не можете использовать сокет?

РЕДАКТИРОВАТЬ: моя версия вашего кода выглядит следующим образом:

    static class Server implements Runnable
    {

        public void run()
        {
            try
            {
                ServerSocket serverSock = new ServerSocket(62666);
                for (;;)
                {
                    Socket sock = serverSock.accept();
                    System.out.println("From IP: " + sock.getInetAddress());
                    BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                    PrintWriter writer = new PrintWriter(sock.getOutputStream());
                    String line;
                    while ((line = reader.readLine()) != null)
                    {
                        System.out.println("\t:" + line);
                    }
                    writer.println("Testing123");
                    writer.close();
                    reader.close();
                    System.out.println("Server exiting");
                    serverSock.close();
                    break;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    static class Client implements Runnable
    {

        public void run()
        {
            try
            {
                URL url = new URL("http://127.0.0.1:62666");
                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                connection.setDoOutput(true);
//              connection.setRequestMethod("POST");
                connection.connect();
                PrintWriter writer = new PrintWriter(connection.getOutputStream());
                writer.println("Hello");
                writer.flush();
                System.out.println("flushed");
                int responseCode = connection.getResponseCode();
                writer.close();
                BufferedReader  reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                System.out.println("closed");
                System.out.println("response code="+responseCode);
                String  line;
                while ((line = reader.readLine()) != null)
                    System.out.println("client read "+line);
                reader.close();
                System.out.println("Client exiting");
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void  main(String[] args)
    {
        Thread  t = new Thread(new Server());
        t.setDaemon(true);
        t.start();
        new Client().run();
        System.out.println("Main exiting");
    }
0 голосов
/ 18 июля 2011

Я думаю, что это то, что вам нужно сделать, если вы хотите, чтобы клиент отправил сообщение на сервер, используя URL-соединение:

public class Client
{
    public Client()
    {
        try
        {
            url = new URL("http://127.0.0.1:62666");
            URLConnection urlConnection = url.openConnection();
            PrintWriter writer = new PrintWriter(urlConnection.getOutputStream());
            writer.println("Hello World!");
            writer.flush();
            writer.close();
        }catch(Exception e){e.printStackTrace();}
    }
}

Теперь вот сервер:

public class Server implements Runnable
{
    public Server()
    {
        ServerSocket server = new Server(62666);
        client = server.accept();
        new Thread(this).start();  
    }

    public void run()
    {
        try
        {
            String message;
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()))
            while((message=reader.readLine())!=null)
            {
                System.out.println("Message from client: "+message);
            }
        }catch(Exception e)
        {
            System.out.println("Client disconnected");
        }
    }
    Socket client;
}
...