我试图用java编写一个简单的http服务器。到目前为止,我的代码如下:
服务器:
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Server
{
static final int PORT = 8080;
final String REQUEST_FORMAT = "^GET (.*?) HTTP/1.1$";
final Socket client;
public Server(Socket s)
{
client = s;
}
public void run()
{
try
(Scanner in = new Scanner(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(),true);)
{
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));
System.out.println(request);
out.write("HTTP/1.1 200 OK");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String []args)
{
try
(
ServerSocket server = new ServerSocket(PORT);
Socket client = server.accept();
)
{
Server s = new Server(client);
s.run();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}客户端:
import java.net.*;
import java.io.*;
import java.util.*;
public class Client
{
final int PORT = 8080;
String data = "GET /home/index.html HTTP/1.1";
public Client()
{
try
(Socket socket = new Socket("127.0.0.1",PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
Scanner in = new Scanner(new InputStreamReader(socket.getInputStream()));)
{
out.print(data);
String header1 = in.next();
System.out.println("header="+header1);
int status = in.nextInt();
System.out.println("status="+status);
String message = in.next();
System.out.println("message="+message);
}
catch(Exception ex)
{
}
}
public static void main(String []args)
{
Client c = new Client();
}
}目前,客户端只向服务器写入一个样例请求,而服务器只编写一个示例响应头。但是,在读取请求后,服务器似乎在无限地等待客户端输入,而没有继续发送响应。请帮助解决这个问题。
发布于 2015-02-23 17:00:46
您的服务器在
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));原因是,没有找到模式,流也没有完成。
解决方案A:关闭在客户端写入的套接字
out.print(data);
socket.shutdownOutput();只有当您不想在客户端进行进一步的写作时,这才能起作用。
解B
发布于 2015-02-23 17:31:41
如果要实现HTTP服务器,则需要实现HTTP协议。你不能那么做。您需要详细了解RFC 2616,特别是有关内容长度标头、连接:关闭和块传输编码的部分,这些部分是确定正在传输的内容的长度的不同方法。
你也不会在任何时候写台词。HTTP中的行终止符是\r\n,,它在代码中没有出现。
还有其他的问题。您的服务器只接受一个客户端,然后停止。它需要一个循环围绕接受代码,它需要启动一个新的线程来处理每个连接。
https://stackoverflow.com/questions/28676203
复制相似问题