`
zhaohaolin
  • 浏览: 1012300 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

先看ServerSocket的封装主要为

Java代码  收藏代码
  1. public   abstract   class  ServerSocketFactory  implements  Cloneable  
public abstract class ServerSocketFactory implements Cloneable
 
Java代码  收藏代码
  1. class  DefaultServerSocketFactory  extends  ServerSocketFactory {  
  2.   
  3.     DefaultServerSocketFactory () {  
  4.         /* NOTHING */   
  5.     }  
  6.   
  7.     @Override   
  8.     public  ServerSocket createSocket ( int  port)  
  9.     throws  IOException {  
  10.         return    new  ServerSocket (port);  
  11.     }  
  12.   
  13.     @Override   
  14.     public  ServerSocket createSocket ( int  port,  int  backlog)  
  15.     throws  IOException {  
  16.         return   new  ServerSocket (port, backlog);  
  17.     }  
  18.   
  19.     @Override   
  20.     public  ServerSocket createSocket ( int  port,  int  backlog,  
  21.         InetAddress ifAddress)  
  22.     throws  IOException {  
  23.         return   new  ServerSocket (port, backlog, ifAddress);  
  24.     }  
  25.    
  26.     @Override   
  27.     public  Socket acceptSocket(ServerSocket socket)  
  28.     throws  IOException {  
  29.     return  socket.accept();  
  30.     }  
  31.    
  32.     @Override   
  33.     public   void  handshake(Socket sock)  
  34.     throws  IOException {  
  35.         // NOOP   
  36.     }  
  37.           
  38.           
  39.  }  
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代码  收藏代码
  1. package  com.test.socket;  
  2. import  java.io.*;  
  3. import  java.io.IOException;  
  4. import  java.net.ServerSocket;  
  5. import  java.net.Socket;  
  6. import  org.apache.tomcat.util.net.*;  
  7. public   class  testendpoint {  
  8.   
  9.     protected   volatile   boolean  running =  false ;  
  10.     /**  
  11.      * Server socket acceptor thread.  
  12.      */   
  13.     protected  ServerSocket serverSocket =  null ;  
  14.     protected  ServerSocketFactory serverSocketFactory =  null ;  
  15.     public   void  start()  throws  Exception {  
  16.         running = true ;  
  17.         //获得serverSocketFactory   
  18.         serverSocketFactory = ServerSocketFactory.getDefault();  
  19.         //获得serverSocket,监听8080端口   
  20.         serverSocket = serverSocketFactory.createSocket(8080 );  
  21.         //建立监听线程   
  22.         Thread acceptorThread = new  Thread( new  Acceptor(), "-Acceptor-" );  
  23.         acceptorThread.start();  
  24.     }  
  25.       
  26.     //处理socket   
  27.     protected   boolean  processSocket(Socket socket)  throws  IOException {  
  28.         BufferedReader in = new  BufferedReader( new  InputStreamReader(  
  29.                         socket.getInputStream()));  
  30.         String inputLine;  
  31.         while  ((inputLine = in.readLine()) !=  null ) {     
  32.             System.out.println(inputLine);  
  33.         }  
  34.   
  35.         return   true ;  
  36.     }  
  37.     //监听类,不断循环   
  38.     protected   class  Acceptor  implements  Runnable {  
  39.   
  40.         /**  
  41.          * The background thread that listens for incoming TCP/IP connections and  
  42.          * hands them off to an appropriate processor.  
  43.          */   
  44.         public   void  run() {  
  45.   
  46.             // Loop until we receive a shutdown command   
  47.             while  (running) {  
  48.   
  49.                 // Loop if endpoint is paused   
  50.                 // Accept the next incoming connection from the server socket   
  51.                 try  {  
  52.                     Socket socket = serverSocketFactory.acceptSocket(serverSocket);  
  53.                     serverSocketFactory.initSocket(socket);  
  54.                     // Hand this socket off to an appropriate processor   
  55.                     if  (!processSocket(socket)) {  
  56.                         // Close socket right away   
  57.                         try  {  
  58.                             socket.close();  
  59.                         } catch  (IOException e) {  
  60.                             // Ignore   
  61.                         }  
  62.                     }  
  63.                 }catch  ( IOException x ) {  
  64.                       
  65.                 } catch  (Throwable t) {  
  66.                       
  67.                 }  
  68.   
  69.                 // The processor will recycle itself when it finishes   
  70.   
  71.             }  
  72.   
  73.         }  
  74.   
  75.     }  
  76. }  
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代码  收藏代码
  1. package  com.test.socket;  
  2. import  org.apache.tomcat.util.net.*;  
  3. public   class  Servertest {  
  4.   
  5.     /**  
  6.      * @param args  
  7.      */   
  8.     public   static   void  main(String[] args) {  
  9.         // TODO Auto-generated method stub   
  10.           
  11.         testendpoint ts = new  testendpoint();  
  12.         try  {  
  13.             System.out.println("Server start" );  
  14.             ts.start();  
  15.         } catch  (Exception e) {  
  16.             // TODO Auto-generated catch block   
  17.             e.printStackTrace();  
  18.         }  
  19.           
  20.     }  
  21.   
  22. }  
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代码  收藏代码
  1. package  com.test.socket;  
  2. import  java.net.Socket;  
  3. import  java.net.UnknownHostException;  
  4. import  java.io.*;  
  5. public   class  ClientTest {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */   
  10.     public   static   void  main(String[] args) {  
  11.         // TODO Auto-generated method stub   
  12.        //String host="127.0.0.1";   
  13.        String host = "localhost" ;  
  14.         Socket socket = null ;  
  15.         try  {  
  16.             socket = new  Socket(host, 8080 );  
  17.         } catch  (UnknownHostException e1) {  
  18.             // TODO Auto-generated catch block   
  19.             e1.printStackTrace();  
  20.         } catch  (IOException e1) {  
  21.             // TODO Auto-generated catch block   
  22.             e1.printStackTrace();  
  23.         }  
  24.                   
  25.         try  {  
  26.             PrintWriter out = new  PrintWriter(socket.getOutputStream(),  true );  
  27.             out.println("Send to host1" );  
  28.             out.println("Send to host2" );  
  29.         } catch  (IOException e) {  
  30.             // TODO Auto-generated catch block   
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.     }  
  35.   

分享到:
评论

相关推荐

    tomcat源码解析

    ### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java ...通过对Tomcat源码的深入分析,我们可以更好地理解它是如何工作的,以及如何利用其强大的功能来构建高效、稳定的Web应用。

    tomcat工作原理(中文版)

    - **ServerSocket类**:讲解如何使用ServerSocket监听端口并接受客户端连接。 2. **第2章:一个简单的Servlet容器** - **Servlet接口**:定义了Servlet的基本行为和生命周期方法。 - **HttpServer1类**:实现一...

    how tomcat works

    ### Tomcat工作原理详解 #### 一、简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web开发之中。它不仅能够运行Java Servlet,还支持JSP技术...了解这些基础知识对于深入理解和使用Tomcat至关重要。

    11. 计算机网络编程(Socket)思维导图

    在Java中,Socket类封装了必要的信息,包括连接协议、IP地址和端口号,使得客户端和服务端能够进行有效的交互。 1. **Socket概念** - Socket,也称为套接字,是网络通信中的一个抽象概念,它是两个网络进程间通信...

    Java入门及例子 (Tomcat, Android, 环境设定).doc

    Java提供了丰富的网络编程API,如Socket和ServerSocket类,用于实现客户端和服务器之间的通信。还可以使用URL和URLConnection类来访问网络资源。 **7. Java数据库连接(JDBC)** Java Database Connectivity (JDBC)...

    2020年最新Java基础精品教程[视频课程].txt打包整理.zip

    - **Socket通信**:学习TCP和UDP的网络通信模型,掌握Socket和ServerSocket的使用。 - **HTTP协议**:了解HTTP的基本概念,如何发送GET和POST请求。 8. **Apache相关技术** - **Tomcat服务器**:安装配置Tomcat...

    java 基础到高级应用

    - 使用Swing和MySQL构建一个学生成绩管理系统。 - 涵盖需求分析、系统设计、数据库设计、编码实现等软件工程过程。 - 实现功能包括密码修改、新生报到、基本信息查询、成绩查询等。 - **广陵学院图书馆管理系统*...

    java超经典面试题

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括基础语法、面向对象、集合框架、多线程、异常处理、JVM内存管理、IO流、网络编程、设计模式、Spring框架、Struts框架、Tomcat服务器等。以下是对这些...

    j2ee软件工程师就业培训,java核心技术

    此外,了解类、对象和封装的概念,以及如何使用继承和多态性来实现面向对象编程。 2. **集合框架**:Java集合框架是处理对象数组的强大工具,包括List、Set和Map接口,以及ArrayList、LinkedList、HashSet、HashMap...

    《Java程序设计》课程案例探讨.zip

    7. **网络编程**:Java提供了Socket和ServerSocket类进行网络通信。学习如何创建客户端和服务器端的连接,进行数据的发送和接收。 8. **Java应用程序和Web应用程序开发**:Java可以开发桌面应用程序,也可以通过...

    java多线程tcpsocketserver源码-FastCGI:来自OpenMarket的FastCGI实现的副本以及一些有用的补丁

    Java多线程TCP Socket服务器源码是用于构建高性能、可扩展网络服务的基础,尤其是在...通过对这些源码的学习和分析,开发者可以深入理解Java多线程TCP服务器以及FastCGI协议的实现细节,从而提升网络服务开发的能力。

    精品资料(2021-2022收藏)JAVA+android-.pdf

    10. **网络编程**:Java支持TCP和UDP网络通信,可以创建Socket和ServerSocket进行数据交换。 11. **JDBC**:Java Database Connectivity,用于连接和操作数据库,包括连接、查询、事务处理等。 12. **设计模式**:...

    java技术

    - **封装、继承和多态**:面向对象的三大特性,封装保护数据,继承实现代码复用,多态提供灵活性。 - **异常处理**:Java强制使用try-catch-finally语句块处理异常,确保程序的健壮性。 - **垃圾回收机制**:自动...

    学习笔记 十分有用 java

    此外,笔记中还包含了对Tomcat服务器的介绍和使用。Tomcat是一款轻量级的Java Web应用服务器,是初学者部署和运行Servlet、JSP应用的首选。这里将讲解如何安装配置Tomcat,创建Web项目,以及如何发布和调试应用。...

    最新Java程序员面试题合集

    - **Socket编程**:了解TCP和UDP协议,学会使用Socket和ServerSocket进行网络通信。 - **HTTP协议**:理解HTTP请求和响应的结构,以及HttpClient库的使用。 10. **Java虚拟机(JVM)** - **内存模型**:了解堆、...

    30天学通Java项目开发源代码

    10. **Web开发**:如果书中涉及Web项目,那么你可能会看到关于Servlet、JSP、Filter、Listener等Web组件的使用,以及如何结合Tomcat服务器运行和部署Java Web应用。 通过深入研究这些源代码,你不仅可以提升Java...

    java编写的浏览器和服务器

    1. 监听套接字:使用`java.net.ServerSocket`创建一个监听特定端口的服务器,等待客户端连接。 2. 处理线程:每当有客户端连接时,服务器会创建一个新的线程来处理请求,避免阻塞其他客户端。 3. HTTP解析:接收...

    华为面试题

    777意味着文件或目录对所有用户都有读、写和执行权限,这是最开放的权限设置,通常不推荐在生产环境中使用,因为这可能会导致安全问题。 #### 3. final、finally与finalize的区别 - **final**:修饰符,可以用于...

Global site tag (gtag.js) - Google Analytics