服务端代码:
//服务器端
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动==========");
while(!serverSocket.isClosed()){
Socket socket = serverSocket.accept(); //阻塞,等待连接
System.out.println("与 " + socket.toString() + "连接成功");
try{
// I/O
InputStream inputStream = socket.getInputStream(); //接收数据流
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String message;
while((message = reader.readLine())!= null){
if(message.length() == 0) break;
System.out.println(message);
}
System.out.println("接收到来至:" + socket.toString() + "的数据");
}catch (IOException e){
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务器端启动:
使用浏览器与服务器端交互localhost:8888
回到服务器端查看输出:
浏览器与服务器端建立连接成功,并遵循HTTP协议发出请求数据包:
HTTP协议中请求数据头通常包括四个部分:
- 请求行,包括:请求类型,资源路径以及HTTP版本等信息。
- 请求头部,紧接着请求行之后的部分,用来说明服务器要使用的附加信息。
- 空行,请求头部后面的空行,是必须的。
- 请求数据,也叫主体,可以添加任何数据。
在这个例子中请求数据为空。
在上面,浏览器与服务器端交互时,提示网页无法运行。
这是因为,服务器端没有对浏览器发出的请求做出响应。我们需要在服务器端编写响应浏览器的代码。
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动==========");
while(!serverSocket.isClosed()){
Socket socket = serverSocket.accept(); //阻塞,等待连接
System.out.println("与 " + socket.toString() + "连接成功");
try{
// I/O
InputStream inputStream = socket.getInputStream(); //接收数据流
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String message;
while((message = reader.readLine())!= null){
if(message.length() == 0) break;
System.out.println(message);
}
System.out.println("接收到来至:" + socket.toString() + "的数据");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
outputStream.write("Content-Length:11\r\n\n".getBytes());
outputStream.write("Hello World!".getBytes());
outputStream.flush();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
浏览器重新访问:localhost:8888
得到响应结果。
附:HTTP协议——响应状态码
- 1XX(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码
- 2XX(成功)
表示成功处理了请求的状态代码。
- 3XX(重定向)
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。
- 4XX(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
- 5XX(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。