【问题标题】:Java, local TCP server accepting HTTP requests from a browserJava,本地 TCP 服务器接受来自浏览器的 HTTP 请求
【发布时间】:2012-05-16 19:07:25
【问题描述】:

我正在尝试“编写一个 Java 程序,它是一个 TCP 服务器,它向浏览器返回一个 HTTP 响应,显示客户端的 IP 地址和它连接到服务器的次数”

目前我认为正在发生的事情。我正在创建一个服务器并监听请求的端口(作为参数输入),然后填充一个字节数组并将该数组转换为字符串。我希望此时只看到请求。

我的问题是,如果我确实尝试通过访问我的网络浏览器并输入“localhost:1235”来连接到该服务器,我的浏览器只会一直说“正在连接到...”,而我的程序什么也不做,它只是坐着,然后等待。

我该如何解决/并实施其余部分?我目前的问题可能是什么?

到目前为止,这是我的代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class TCPHTTP 
{
private static final int MAXFILELEN = 4096000;
static byte[] request = new byte[MAXFILELEN];
static String[] log;

public static void main (String args[])
{
    if (args.length != 1) 
        throw new IllegalArgumentException( "Parameter(s): <Port>");

    int port = Integer.parseInt(args[0]); 

    ServerSocket socket = null;
    Socket sock = null;

    try 
    {
        socket = new ServerSocket(port);
    } 
    catch (IOException e) 
    {
        return;
    }
    for (;;) 
    {
        try 
        {
            sock = socket.accept();
            InputStream is = sock.getInputStream();
            int offset = 0;
            int len = 0;
            while ((len = is.read(request, offset, MAXFILELEN - offset)) >= 0)
            {
                offset += len;
            }

            String s = new String(request);
            System.out.println(s);

            // Add the users IP to the log
            String from = "From: ";
            int loglen = log.length;
            int indexOfSenderIP = s.indexOf(from, 0);
            indexOfSenderIP += from.length();
            int indexOfNewline = s.indexOf("\n", indexOfSenderIP);
            String sendersIP = s.substring(indexOfSenderIP, indexOfNewline);
            log[loglen] = sendersIP;

            //Find out how many times the sender IP appears in the log
            int timesVisited = 0;
            for(int i = 0; i < log.length; i++)
                if(log[i].endsWith(sendersIP))
                    timesVisited++;

            // Construct the HTTP response message
            String httpResponse = "";

            OutputStream os = sock.getOutputStream();
            os.write(httpResponse.getBytes());

            os.close();
            is.close();
            sock.close();
        } 
        catch (IOException e) 
        { 
            break; 
        }
}
}
}

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    考虑添加一个Content-Length 标头来指定响应的大小,以便浏览器知道要读取多少。

    【讨论】:

      【解决方案2】:

      您的程序冻结的原因是它等待客户端关闭连接(读取在 eof 之后返回一个

      【讨论】:

      • 所以像这样 "boolean leave = false; while ((len = is.read(request, offset, MAXFILELEN - offset)) >= 0 && leave == false) { offset += len ; String stmp = new String(request); if(stmp.contains("\r\n\r\n")); leave = true; }"
      • 应该可以(单个 \r\n 也可以),另外,您可以使用 break 代替布尔值 leave
      【解决方案3】:
      String httpResponse = "";
      

      这不是一个有效的 HTTP 响应。您的浏览器正在等待正确的响应。发送一个。

      【讨论】:

        【解决方案4】:

        据我所知,您在回答客户请求之前关闭了套接字

        另外,我测试了你的代码,而循环永远不会结束

        【讨论】:

        • 我更改了上面的代码。现在看看。我仍然遇到浏览器说“正在连接......”的同样问题。
        • while 循环永远不会结束,而且它没有理由存在,因为您不会使用该数据。您可以删除它并立即回复客户,或修复它
        • 但是我不需要阅读请求以便找到发件人 IP 吗?我认为正在做的是阅读整个请求,直到它到达最后。那么它到底在做什么呢?
        • 不,你可以从socket获取发送者的ip(.getInetAddress()方法)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        相关资源
        最近更新 更多