Java – 通过浏览器/ URL连接到ServerSocket

我正在编写一个软件,我受限于无法使用socket连接到使用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(); } 

它打印出“应该有效”消息fyi,但它从不向服务器的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中)。

希望这有道理:)

谢谢,迈克。

我无法弄明白到底是什么。 OutputStream有一些有趣的东西。 添加一个

 ((HttpURLConnection) connection).getResponseCode(); 

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

也许你不应该尝试使用HTTP作为黑客攻击,而应该使用完整的HTTP。 像您一样使用来自客户端的HTTP,并在服务器上设置嵌入式HTTP服务器。 有几个可供选择,从字面上只需几行就可以运行:例如Grizzly , Simple Framework或Jetty 。

我想如果您希望客户端使用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();} } } 

现在inheritance服务器:

 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; } 
 writer.println("Hello"); 

你没有发送任何新行。 你的“应该有效”的痕迹也在错误的地方。 应该是在flush()之后。

你也没有阅读回复。

此外,服务器只会显示POST …或PUT …,而不是您要发送的行。 所以除非你(a)使服务器具有HTTP意识或(b)摆脱这种疯狂的限制,你不能使用套接字,否则这永远不会起作用。 为什么你不能使用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"); } 

有一个非常好的例子 :

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