Socket socket = new Socket ( "yahoo.com", 80);
OutputStream os = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //send an Http request to the web server
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection: Close:);
out.println(); //read the response
boolean loop = true;
StringBuffer sb = new StringBuffer(8096);
while (loop) {
if (in.ready()) {
int i = 0;
while (i!=-1) {
i = in.read();
sb.append((char) i);
}
loop = false;
}
Thread.currentThread().sleep(50);
} //display the response to thr out console
System.out.println(sb.toString());
socket.close();

空行用于分割 POST 方法的请求体。request.parse() 根据这个格式解析,获得 URI (第一行第一个空格后的字符串)等。

java.net.Socket 类表示一个客户端套接字,即当客户端主动想要连接到远程服务器应用程序时创建的套接字。

但是如果想要实现一个服务器应用程序,它并不知道客户端应用程序会在什么时候发起连接,因此必须时刻待命。需要使用服务器套接字 java.net.ServerSocket,服务器套接字等待来自客户端的连接请求,当服务器套接字接收到了连接请求后,它会创建一个 Soket 实例来处理与客户端的通信。


ServerSocket serverSocket = new ServerSocket(8080, 2, InetAddress.getByName("yahoo.com"));
Socket socket = serverSocket.accept();
InputStream input = socket.getInputStream();
OutputStream out = socket.getOutStream();
// create Request Object and parse
Request request = new Request(input);
request.parse();

// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();

// Close the socket
socket.close();

第二个参数 backlog 表示,在服务器拒绝接收传入的请求之前,传入的连接请求的最大队列长度。

ServerSocket 类的 accept 方法:

创建了 ServerSocket 实例后,可以使其等待传入的连接请求,只有当接收到连接请求后,该方法才会返回,其返回值时一个 Socket 实例,然后使用该 Socket 对象与客户端进行字节流的发送/接收。

javax.servlet.servlet 接口最为重要,所有的 servlet 程序都必须实现该接口,或继承实现了该接口的类。在该接口声明的5个方法中,init() service() destroy() 方法是与 servlet 生命周期相关的方法。在init() 中编写仅需执行一次的初始化代码,一般情况下,init() 方法可以留空。在 servlet 对象的整个生命周期内,service() 方法会被多次调用。一般当 servlet 容器关闭或 servlet 容器要释放内存,而且只有当servlet 实例中的 service() 方法中的所有线程都退出或执行超时后,才会调用 destroy() 方法。

service 的入参也要分别实现 javax.servlet.ServletRequest 接口和 javax.servlet.ServletResponse 接口,或继承实现了它们的类。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
// package javax.servlet; import java.io.IOException; public interface Servlet {
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
}

一个功能齐全的 servlet 容器有以下事即将要做:

    • 当第一次调用某个 servlet 时,哟啊载入该 servlet 类,并调用其 init() 方法(仅此一次);
    • 针对每个 request 请求,创建一个 javax.servlet.ServletRequest 实例和一个 javax.servlet.ServletResponse 实例;
    • 调用该 servlet 的 service() 方法,将 ServletRequest 对象和 ServletResponse 对象作为参数传入;
    • 当关闭该 servlet 类时,调用其 destroy() 方法,并卸载该 servlet 类。

最新文章

  1. [每日一记] Python报错 综述
  2. Hibernate 基础配置及常用功能(三)
  3. Excel 二级下拉菜单
  4. UnityShader之固定管线命令Combine纹理混合【Shader资料4】
  5. Educational Codeforces Round 4 A. The Text Splitting 水题
  6. Codeforces Round #296 (Div. 2) A B C D
  7. 首次启动优美新手指引tip
  8. 使用Spring构建RMI服务器和客户端
  9. Python学习记录----IDE安装
  10. ubuntu上修改root密码
  11. python常用的内置函数哈哈
  12. 关于wxpython多线程研究包括(import Publisher等错误研究)
  13. Python:从入门到实践--第三章--列表简介--练习
  14. BZOJ4477[Jsoi2015]字符串树——可持久化trie树
  15. web服务搭建
  16. 20169207《Linux内核原理与分析》第八周作业
  17. 推荐五星级C语言学习网站
  18. ActivityGroup实现tab功能
  19. asp.net webapi 自托管插件式服务(转)
  20. yum 常用命令

热门文章

  1. C#整合ActiveMQ与SpringBoot整合ActiveMQ数据间交互
  2. QML笔记
  3. 前端下载csv文件
  4. Vue.js中使用iView日期选择器并设置开始时间结束时间校验
  5. git修改远程分支
  6. 最大流模板(EK,Dinic
  7. 一条命令删除所有静态路由华为eNSP
  8. Window10上CLion极简配置教程
  9. 12.java链表栈和数组栈
  10. Go组件库总结之无等待锁