用JAVA Socket向http服务器发送GET命令

闲的蛋疼,于是就打算写点什么。本来在研究简单TCPIP服务的,后来发现本机上居然没有,f**k ,于是就去搞搞http服务了。


本机上装的是apache Http服务器,网上找到http协议的格式,最简单的是 GET PATH HTTP/1.1 (CRLF) ,于是就用java写了起来。


第一次代码很简单, 直接用socket 连接本机80端口,然后向端口写"GET / HTTP/1.1"然后就等待。

结果。。就读不出来。百度之,  http 协议需要以俩个换行做结束符。于是就把代码改成这样。
 BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream()));
 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));

 out.write("GET / HTTP/1.1\r\n");
out.write("\r\n");
 out.flush(); 

结果,给我返回了400错误。当时把语法错误理解错了,以为是字符编码的问题,百度后找到个URLEncoder.encode设置字符的方法。

这倒好,直接返回了501错误。这个错误误导了我很长时间。

最后还是去查http协议,发现GET方法还有一些附加信息。加上附加信息后,调试成功。最后发现,其实只要在附加信息中指定host就可以了。我觉得这个可能和不同的http服务器有关。


代码如下



package baiyangtx;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class HttpConnection
{

    /**
     * @param args
     * @throws IOException 
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException, IOException
    {
        String ip = "127.0.0.1" ;
        int port = 80 ;

        Socket soc = new Socket(ip, port);
        
        System.out.println("----------------------------------");
        System.out.println("\n\n\n\n");

        
        BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
        

        
        StringBuffer meth = new StringBuffer();
        meth.append("GET / HTTP/1.1\r\n");
     //   meth.append("accept:*/*\r\n");
        meth.append("host:127.0.0.1\r\n");
        meth.append("");
        meth.append("");
        

        out.write(meth.toString());
        out.write("\r\n");
        out.flush();  
        
        String line = null ;

        
        while( (line = in.readLine())!= null)
        {
            System.out.println(line);
        }
        
        in.close() ;
        out.close() ;
        soc.close() ;
    }

}



输出
----------------------------------





HTTP/1.1 200 OK
Date: Tue, 06 Mar 2012 12:32:58 GMT
Server: Apache/2.2.22 (Win32)
Last-Modified: Tue, 06 Mar 2012 11:46:06 GMT
ETag: "b000000008d9e-57-4ba9196947acd"
Accept-Ranges: bytes
Content-Length: 87
Content-Type: text/html

<head>
<title>?1?7?1?7?1?7?1?7?1?7?1?7?0?7</title>
</head>
<body> Here is body!</body>

</html>
   
终于看到了期待已久的HTTP/1.1 200 OK 。

<title>标签中的乱码是因为原来html文件中存的是中文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Token进行身份验证的Java Socket服务器示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TokenAuthenticationServer { // Token验证函数 private static boolean authenticate(String token) { // 在这里实现验证逻辑,比如检查Token的有效性、过期时间等 if (token.equals("valid_token")) { return true; } else { return false; } } public static void main(String[] args) { int port = 12345; // 服务器监听的端口 try { ServerSocket serverSocket = new ServerSocket(port); System.out.println("服务器启动,监听端口 " + port + "..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("客户端 " + clientSocket.getInetAddress().getHostName() + " 连接成功!"); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); // 接收Token String token = in.readLine(); // 验证Token if (authenticate(token)) { out.println("身份验证成功!"); // 在这里处理客户端的其他请求 } else { out.println("身份验证失败!"); } // 关闭连接 clientSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,服务器创建一个ServerSocket对象,监听指定的端口。当客户端连接成功后,服务器接收客户端发送的Token,并调用`authenticate`函数对Token进行验证。如果验证成功,服务器发送"身份验证成功!"消息给客户端,并可以处理客户端的其他请求;如果验证失败,服务器发送"身份验证失败!"消息给客户端。 请注意,这只是一个简单的示例,你可以根据自己的需求和业务逻辑来扩展和完善代码。同时,为了增加安全性,你可能需要在验证Token时添加更多的逻辑,如使用加密算法对Token进行签名和验证、设置Token的过期时间等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值