设为首页 收藏本站
查看: 272|回复: 0

[经验分享] tomcat 7 源码分析-9 tomcat对ServerSocket的封装和使用

[复制链接]

尚未签到

发表于 2017-1-31 13:10:45 | 显示全部楼层 |阅读模式

tomcat 7 源码分析-9 tomcat对ServerSocket的封装和使用

  tomcat中ServerSocket线程监听是否有socket连接,如果有就转而处理。这个过程类似于你向tomcat发送一个URL请求,实质这个请求转换成http协议,通过socket发出来。
  先看ServerSocket的封装主要为

Java代码   DSC0000.png DSC0001.gif






  • public
     
    abstract
     
    class
     ServerSocketFactory 
    implements
     Cloneable  




public abstract class ServerSocketFactory implements Cloneable
 
Java代码  






  • class
     DefaultServerSocketFactory 
    extends
     ServerSocketFactory {  


  •   

  •     DefaultServerSocketFactory () {  

  •         /* NOTHING */
      


  •     }  

  •   

  •     @Override
      


  •     public
     ServerSocket createSocket (
    int
     port)  


  •     throws
     IOException {  


  •         return
      
    new
     ServerSocket (port);  


  •     }  

  •   

  •     @Override
      


  •     public
     ServerSocket createSocket (
    int
     port, 
    int
     backlog)  


  •     throws
     IOException {  


  •         return
     
    new
     ServerSocket (port, backlog);  


  •     }  

  •   

  •     @Override
      


  •     public
     ServerSocket createSocket (
    int
     port, 
    int
     backlog,  


  •         InetAddress ifAddress)  

  •     throws
     IOException {  


  •         return
     
    new
     ServerSocket (port, backlog, ifAddress);  


  •     }  

  •    

  •     @Override
      


  •     public
     Socket acceptSocket(ServerSocket socket)  


  •     throws
     IOException {  


  •     return
     socket.accept();  


  •     }  

  •    

  •     @Override
      


  •     public
     
    void
     handshake(Socket sock)  


  •     throws
     IOException {  


  •         // NOOP
      


  •     }  

  •           

  •           

  •  }  



class DefaultServerSocketFactory extends ServerSocketFactory {
DefaultServerSocketFactory () {
/* NOTHING */
}
@Override
public ServerSocket createSocket (int port)
throws IOException {
return  new ServerSocket (port);
}
@Override
public ServerSocket createSocket (int port, int backlog)
throws IOException {
return new ServerSocket (port, backlog);
}
@Override
public ServerSocket createSocket (int port, int backlog,
InetAddress ifAddress)
throws IOException {
return new ServerSocket (port, backlog, ifAddress);
}
@Override
public Socket acceptSocket(ServerSocket socket)
throws IOException {
return socket.accept();
}
@Override
public void handshake(Socket sock)
throws IOException {
// NOOP
}

}
  做了个小例子,模拟8080端口,可以通过浏览器想serversocket发消息。

Java代码  






  • package
     com.test.socket;  


  • import
     java.io.*;  


  • import
     java.io.IOException;  


  • import
     java.net.ServerSocket;  


  • import
     java.net.Socket;  


  • import
     org.apache.tomcat.util.net.*;  


  • public
     
    class
     testendpoint {  


  •   

  •     protected
     
    volatile
     
    boolean
     running = 
    false
    ;  


  •     /**
     

  •      * Server socket acceptor thread.
     

  •      */
      


  •     protected
     ServerSocket serverSocket = 
    null
    ;  


  •     protected
     ServerSocketFactory serverSocketFactory = 
    null
    ;  


  •     public
     
    void
     start() 
    throws
     Exception {  


  •         running = true
    ;  


  •         //获得serverSocketFactory
      


  •         serverSocketFactory = ServerSocketFactory.getDefault();  

  •         //获得serverSocket,监听8080端口
      


  •         serverSocket = serverSocketFactory.createSocket(8080
    );  


  •         //建立监听线程
      


  •         Thread acceptorThread = new
     Thread(
    new
     Acceptor(),
    "-Acceptor-"
    );  


  •         acceptorThread.start();  

  •     }  

  •       

  •     //处理socket
      


  •     protected
     
    boolean
     processSocket(Socket socket) 
    throws
     IOException {  


  •         BufferedReader in = new
     BufferedReader(
    new
     InputStreamReader(  


  •                         socket.getInputStream()));  

  •         String inputLine;  

  •         while
     ((inputLine = in.readLine()) != 
    null
    ) {     


  •             System.out.println(inputLine);  

  •         }  

  •   

  •         return
     
    true
    ;  


  •     }  

  •     //监听类,不断循环
      


  •     protected
     
    class
     Acceptor 
    implements
     Runnable {  


  •   

  •         /**
     

  •          * The background thread that listens for incoming TCP/IP connections and
     

  •          * hands them off to an appropriate processor.
     

  •          */
      


  •         public
     
    void
     run() {  


  •   

  •             // Loop until we receive a shutdown command
      


  •             while
     (running) {  


  •   

  •                 // Loop if endpoint is paused
      


  •                 // Accept the next incoming connection from the server socket
      


  •                 try
     {  


  •                     Socket socket = serverSocketFactory.acceptSocket(serverSocket);  

  •                     serverSocketFactory.initSocket(socket);  

  •                     // Hand this socket off to an appropriate processor
      


  •                     if
     (!processSocket(socket)) {  


  •                         // Close socket right away
      


  •                         try
     {  


  •                             socket.close();  

  •                         } catch
     (IOException e) {  


  •                             // Ignore
      


  •                         }  

  •                     }  

  •                 }catch
     ( IOException x ) {  


  •                       

  •                 } catch
     (Throwable t) {  


  •                       

  •                 }  

  •   

  •                 // The processor will recycle itself when it finishes
      


  •   

  •             }  

  •   

  •         }  

  •   

  •     }  

  • }  



package com.test.socket;
import java.io.*;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.tomcat.util.net.*;
public class testendpoint {
protected volatile boolean running = false;
/**
* Server socket acceptor thread.
*/
protected ServerSocket serverSocket = null;
protected ServerSocketFactory serverSocketFactory = null;
public void start() throws Exception {
running = true;
//获得serverSocketFactory
serverSocketFactory = ServerSocketFactory.getDefault();
//获得serverSocket,监听8080端口
serverSocket = serverSocketFactory.createSocket(8080);
//建立监听线程
Thread acceptorThread = new Thread(new Acceptor(),"-Acceptor-");
acceptorThread.start();
}
//处理socket
protected boolean processSocket(Socket socket) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
return true;
}
//监听类,不断循环
protected class Acceptor implements Runnable {
/**
* The background thread that listens for incoming TCP/IP connections and
* hands them off to an appropriate processor.
*/
public void run() {
// Loop until we receive a shutdown command
while (running) {
// Loop if endpoint is paused
// Accept the next incoming connection from the server socket
try {
Socket socket = serverSocketFactory.acceptSocket(serverSocket);
serverSocketFactory.initSocket(socket);
// Hand this socket off to an appropriate processor
if (!processSocket(socket)) {
// Close socket right away
try {
socket.close();
} catch (IOException e) {
// Ignore
}
}
}catch ( IOException x ) {
} catch (Throwable t) {
}
// The processor will recycle itself when it finishes
}
}
}
}

 
Java代码  






  • package
     com.test.socket;  


  • import
     org.apache.tomcat.util.net.*;  


  • public
     
    class
     Servertest {  


  •   

  •     /**
     

  •      * @param args
     

  •      */
      


  •     public
     
    static
     
    void
     main(String[] args) {  


  •         // TODO Auto-generated method stub
      


  •           

  •         testendpoint ts = new
     testendpoint();  


  •         try
     {  


  •             System.out.println("Server start"
    );  


  •             ts.start();  

  •         } catch
     (Exception e) {  


  •             // TODO Auto-generated catch block
      


  •             e.printStackTrace();  

  •         }  

  •           

  •     }  

  •   

  • }  



package com.test.socket;
import org.apache.tomcat.util.net.*;
public class Servertest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
testendpoint ts = new testendpoint();
try {
System.out.println("Server start");
ts.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
   测试,在你的浏览器上输入:http://localhost:8080/
  可以看见发过来的request的整个消息
  Server start

GET / HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115

Connection: keep-alive
  当然也可以写个客户端,向服务器端发数据。

Java代码  






  • package
     com.test.socket;  


  • import
     java.net.Socket;  


  • import
     java.net.UnknownHostException;  


  • import
     java.io.*;  


  • public
     
    class
     ClientTest {  


  •   

  •     /**
     

  •      * @param args
     

  •      */
      


  •     public
     
    static
     
    void
     main(String[] args) {  


  •         // TODO Auto-generated method stub
      


  •        //String host="127.0.0.1";
      


  •        String host = "localhost"
    ;  


  •         Socket socket = null
    ;  


  •         try
     {  


  •             socket = new
     Socket(host,
    8080
    );  


  •         } catch
     (UnknownHostException e1) {  


  •             // TODO Auto-generated catch block
      


  •             e1.printStackTrace();  

  •         } catch
     (IOException e1) {  


  •             // TODO Auto-generated catch block
      


  •             e1.printStackTrace();  

  •         }  

  •                   

  •         try
     {  


  •             PrintWriter out = new
     PrintWriter(socket.getOutputStream(), 
    true
    );  


  •             out.println("Send to host1"
    );  


  •             out.println("Send to host2"
    );  


  •         } catch
     (IOException e) {  


  •             // TODO Auto-generated catch block
      


  •             e.printStackTrace();  

  •         }  

  •           

  •     }  

  •   




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335760-1-1.html 上篇帖子: 【转载】JConsole监控Tomcat简单配置 下篇帖子: Tomcat和Websphere类加载机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表