Java服务器具有多种功能,以下是一些主要的功能:
托管和管理Web应用程序:服务器充当Web应用程序的主机,负责托管和管理应用程序的生命周期。它提供了一个运行环境,使得开发人员能够将应用程序部署到服务器上,并处理来自客户端的请求。处理客户端请求:服务器接收来自客户端的请求,并根据请求的类型和内容提供相应的响应。它可以处理Web页面、数据查询、文件上传等各种类型的请求,并返回相应的结果给客户端。
ServerSocket ss = null;
:声明一个名为ss
的ServerSocket
对象,初始化为null
。try {
:开始一个异常处理块,用于处理可能出现的IO异常。ss = new ServerSocket(7777);
:创建一个新的ServerSocket
对象,并将其端口号设置为7777。这意味着服务器将在这个端口上监听任何传入的连接请求。Socket socket = ss.accept();
:使用前面创建的ServerSocket
对象等待客户端的连接请求。一旦有客户端连接,就会创建一个新的Socket
对象,并将这个连接打开。int len = 0;
:声明一个整型变量len
并初始化为0,后面用来保存从输入流中读取的字节数。byte[] bytes = new byte[1024];
:创建一个字节数组bytes
,长度为1024。这个数组用于保存从输入流中读取的字节。len = socket.getInputStream().read(bytes);
:从客户端的输入流中读取数据,并保存读取的字节数到变量len
中。String req = new String(bytes, 0, len, "utf-8");
:将读取的字节数据转换为UTF-8编码的字符串。这个字符串包含了客户端发送的HTTP请求。String req1 = req.split("\r\n")[0].split(" ")[1];
:从上一步获取的HTTP请求字符串中解析出请求的资源路径。这是通过按照"\r\n"分割字符串,然后选择第一个数组元素,再按照空格进行分割并选择第二个数组元素来实现的。String pathName = req1;
:将解析出的资源路径保存到变量pathName
中。FileInputStream fis = new FileInputStream("webapp" + pathName);
:创建一个新的FileInputStream
对象,用于读取与pathName
对应的文件。假设"webapp"是index.html文件所在的文件夹。OutputStream os = socket.getOutputStream();
:获取与客户端连接对应的输出流。- 通过输出流发送HTTP协议头信息,包括HTTP协议版本、状态码和响应头部字段。
- 计算要发送的文件的大小,并通过输出流发送
Content-Length
响应头部字段。 - 通过输出流发送一个空行,表示响应头部的结束。
- 进入一个循环,将文件内容读取到字节数组中,并通过输出流发送给客户端。
catch (IOException e) { throw new RuntimeException(e); }
:捕获可能出现的IO异常,并抛出一个运行时异常。
总的来说,这段代码的作用是实现一个简单的HTTP服务器,接收HTTP请求,并返回对应的HTTP响应。在这个例子中,服务器只是将从磁盘中读取的index.html文件原样返回给客户端。
public class Main {
public static void main(String[] args) {
ServerSocket ss= null;
try {
ss = new ServerSocket(7777);
Socket socket=ss.accept();
int len=0;
byte[]bytes=new byte[1024];
len=socket.getInputStream().read(bytes);
String req=new String(bytes,0,len,"utf-8");
String req1=req.split("\r\n")[0].split(" ")[1];
String pathName=req1;//已知客户端的意图是获取index.html
// 读取磁盘中的index.html文件,并且通过socket发送给浏览器
FileInputStream fis=new FileInputStream("webapp"+pathName);
//将本地读取的文件发送给客户端
OutputStream os=socket.getOutputStream();
//这个时候还不能直接将数据响应给客户端,服务器和浏览器交互的时候,还需要协议
os.write("HTTP /1.1 200 ok\r\n".getBytes("utf-8"));
os.write("Content-Type:text/html\r\n".getBytes("utf-8"));
File file=new File("webapp"+pathName);
os.write(("Content-Length:" + file.length() + "\r\n").getBytes("utf-8"));
os.write("\r\n".getBytes("utf-8"));
while ((len=fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}