java 套接字写入然后从套接字读取
java socket writing to and then reading from socket
我正在尝试在 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();
}
}
目前客户端只是向服务器写入一个示例请求,而服务器写入一个示例响应头。但服务器似乎在读取请求后无限等待客户端输入,而不继续发送响应。请帮助解决这个问题。
您的服务器在
阻塞
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));
原因是没有找到模式,流也没有结束。
方案A:关闭客户端写入的socket
out.print(data);
socket.shutdownOutput();
这仅在您不想在客户端进行进一步写入时才有效。
方案 B:
客户端:数据后换行。
out.print(data);
out.print("\r\n");
out.flush();
服务器:使用 Scanner.nextLine() 和 Matcher 而不是 Scanner.findInLine()
String line = in.nextLine();
Matcher matcher = Pattern.compile(REQUEST_FORMAT).matcher(line);
String request = null;
if(matcher.find()) {
//request = line.substring(matcher.start(),matcher.end());
request = matcher.group();//is similar to the commented line above
}
如果您要实现 HTTP 服务器,则需要实现 HTTP 协议。你没有那样做。您需要仔细阅读 RFC 2616,特别是关于 content-length header、Connection: close 和分块传输编码的部分,它们是确定传输内容长度的不同方法.
你也没有在任何时候写台词。 HTTP 中的行终止符是 \r\n,
,它不会出现在您的代码中的任何地方。
还有其他问题。您的服务器将只接受一个客户端然后停止。它需要围绕接受代码进行循环,并且需要启动一个新线程来处理每个连接。
我正在尝试在 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();
}
}
目前客户端只是向服务器写入一个示例请求,而服务器写入一个示例响应头。但服务器似乎在读取请求后无限等待客户端输入,而不继续发送响应。请帮助解决这个问题。
您的服务器在
阻塞String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));
原因是没有找到模式,流也没有结束。
方案A:关闭客户端写入的socket
out.print(data);
socket.shutdownOutput();
这仅在您不想在客户端进行进一步写入时才有效。
方案 B:
客户端:数据后换行。
out.print(data); out.print("\r\n"); out.flush();
服务器:使用 Scanner.nextLine() 和 Matcher 而不是 Scanner.findInLine()
String line = in.nextLine(); Matcher matcher = Pattern.compile(REQUEST_FORMAT).matcher(line); String request = null; if(matcher.find()) { //request = line.substring(matcher.start(),matcher.end()); request = matcher.group();//is similar to the commented line above }
如果您要实现 HTTP 服务器,则需要实现 HTTP 协议。你没有那样做。您需要仔细阅读 RFC 2616,特别是关于 content-length header、Connection: close 和分块传输编码的部分,它们是确定传输内容长度的不同方法.
你也没有在任何时候写台词。 HTTP 中的行终止符是 \r\n,
,它不会出现在您的代码中的任何地方。
还有其他问题。您的服务器将只接受一个客户端然后停止。它需要围绕接受代码进行循环,并且需要启动一个新线程来处理每个连接。