Java - 通过浏览器/URL 连接到 ServerSocket
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6726745/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java - connection to ServerSocket via browser/URL
提问by Mike Haye
I'm writing a piece of software, and I'm under the restriction of not being able to use socket to connect to a java application using a ServerSocket.
我正在编写一个软件,并且受到无法使用套接字连接到使用 ServerSocket 的 Java 应用程序的限制。
I thought I'd try with an URL connection, since it's possible to define which port to connect to
我想我会尝试使用 URL 连接,因为可以定义要连接到的端口
e.g:
例如:
127.0.0.1:62666
I have my server app listening for connections and writing the input out to a jTextArea. When connecting to the server (127.0.0.1:62666) through a browser, it outputs:
我让我的服务器应用程序侦听连接并将输入写入 jTextArea。通过浏览器连接服务器(127.0.0.1:62666)时,输出:
GET / HTTP/1.1
GET /favicon.ico HTTP/1.1
I have another app for connecting to the ServerSocket through an URL connection:
我有另一个用于通过 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();
}
It prints out the "should have worked" message fyi, but it never writes anything to the jTextArea of the server. The code for the server app looks like this:
它打印出“应该有效”消息仅供参考,但它从未向服务器的 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();
}
Note: when connecting through the browser it displays the text "Testing123".
注意:当通过浏览器连接时,它会显示文本“Testing123”。
So I'm wondering how to do this the way I'm trying or perhaps read the URL that the ServerSocket was accessed through, so I could access it through a URL while passing it arguments (in the URL).
所以我想知道如何以我尝试的方式执行此操作,或者可能读取 ServerSocket 通过其访问的 URL,因此我可以在传递参数(在 URL 中)时通过 URL 访问它。
Hope this makes sense :)
希望这是有道理的:)
Thanks, Mike.
谢谢,迈克。
回答by Ryan Stewart
I can't figure out exactly what's up. There's something funny about that OutputStream. Add a
我无法弄清楚到底是怎么回事。OutputStream 有一些有趣的地方。添加一个
((HttpURLConnection) connection).getResponseCode();
somewhere after connect()
and before close()
, and you should see something different, if not what you expect.
之后connect()
和之前的某个地方close()
,如果不是您所期望的,您应该会看到不同的东西。
Perhaps instead of trying to use HTTP as a hack, you should just go full HTTP. Use HTTP from the client like you already are, and set up an embedded HTTP server on the server. There are several to choose from out there that literally take just a few lines to get running: Grizzly, Simple Framework, or Jetty, for instance.
也许与其尝试将 HTTP 用作黑客攻击,不如直接使用完整的 HTTP。像您一样使用来自客户端的 HTTP,并在服务器上设置一个嵌入式 HTTP 服务器。有几个可供选择,实际上只需要几行代码就可以运行:例如Grizzly、Simple Framework或Jetty。
回答by DmitryKanunnikoff
There is one very good example:
有一个很好的例子:
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"));
}
}
}
}
Go to http://127.0.0.1:8080/from browser and you'll get current date.
从浏览器转到http://127.0.0.1:8080/,您将获得当前日期。
回答by gsfd
I think this is what you need to do if you want the client to send a message to the server using a URL connection:
如果您希望客户端使用 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();}
}
}
Now heres the server:
现在这里是服务器:
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;
}
回答by user207421
writer.println("Hello");
You're not sending any newline. Also your 'should have worked' trace is in the wrong place. Should be after the flush().
你没有发送任何换行符。此外,您的“应该有效”的痕迹在错误的地方。应该在flush()之后。
Also you aren't reading the response.
你也没有阅读回复。
Also the server is only going to display POST ... Or PUT ..., not the line you're sending. So this is never going to work unless you (a) make the server HTTP-conscious or (b) get rid of this insane restriction that you can't use a Socket. Whycan't you use a Socket?
此外,服务器只会显示 POST ... 或 PUT ...,而不是您发送的行。因此,除非您 (a) 使服务器具有 HTTP 意识或 (b) 摆脱无法使用 Socket 的这种疯狂限制,否则这永远不会起作用。为什么不能使用Socket?
EDIT: my version of your code follows:
编辑:我的代码版本如下:
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");
}