3

我正在编写一个软件,并且我受到无法使用套接字连接到使用 ServerSocket 的 java 应用程序的限制。

我想我会尝试使用 URL 连接,因为可以定义要连接的端口

例如:

127.0.0.1:62666

我让我的服务器应用程序监听连接并将输入输出到 jTextArea。通过浏览器连接到服务器(127.0.0.1:62666)时,输出:

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

我有另一个通过 URL 连接连接到 ServerSocket 的应用程序:

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”。

所以我想知道如何以我尝试的方式执行此操作,或者可能读取访问 ServerSocket 的 URL,因此我可以在传递参数(在 URL 中)时通过 URL 访问它。

希望这是有道理的:)

谢谢,迈克。

4

4 回答 4

2

有一个很好的例子

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/,您将获得当前日期。

于 2015-11-25T13:54:25.553 回答
1

我无法弄清楚到底发生了什么。OutputStream 有一些有趣的地方。添加一个

((HttpURLConnection) connection).getResponseCode();

之后connect()和之前的某个地方close(),如果不是您所期望的,您应该会看到不同的东西。

也许与其尝试使用 HTTP 作为 hack,不如直接使用完整的 HTTP。像您一样使用来自客户端的 HTTP,并在服务器上设置嵌入式 HTTP 服务器。有几个可供选择,实际上只需要几行即可运行:例如GrizzlySimple FrameworkJetty

于 2011-07-17T22:14:51.293 回答
0

如果您希望客户端使用 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;
}
于 2011-07-17T21:35:41.627 回答
0
writer.println("Hello");

您没有发送任何换行符。此外,您的“应该有效”跟踪位于错误的位置。应该在flush()之后。

你也没有阅读回复。

此外,服务器只会显示 POST ... 或 PUT ...,而不是您发送的行。因此,除非您 (a) 使服务器具有 HTTP 意识或 (b) 摆脱无法使用 Socket 的疯狂限制,否则这永远不会起作用。为什么不能使用 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");
    }
于 2011-07-17T21:54:19.807 回答