`
smartvessel
  • 浏览: 82012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

先看ServerSocket的封装主要为

public abstract class ServerSocketFactory implements Cloneable
 
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发消息。

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 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

当然也可以写个客户端,向服务器端发数据。

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();
		}
        
	}

}
分享到:
评论

相关推荐

    tomcat源码解析

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

    how-tomcat-works(中文版).pdf

    书中详细分析了Tomcat的版本4和版本5之间的主要差异,包括架构调整、性能改进以及新功能的引入,帮助读者理解不同版本间的选择依据。 四、章节内容概览 ### 第1章:一个简单的Web服务器 本章从HTTP协议的基础讲起...

    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