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作为一款开源的Servlet容器,被广泛应用于Java ...通过对Tomcat源码的深入分析,我们可以更好地理解它是如何工作的,以及如何利用其强大的功能来构建高效、稳定的Web应用。
书中详细分析了Tomcat的版本4和版本5之间的主要差异,包括架构调整、性能改进以及新功能的引入,帮助读者理解不同版本间的选择依据。 四、章节内容概览 ### 第1章:一个简单的Web服务器 本章从HTTP协议的基础讲起...
- **ServerSocket类**:讲解如何使用ServerSocket监听端口并接受客户端连接。 2. **第2章:一个简单的Servlet容器** - **Servlet接口**:定义了Servlet的基本行为和生命周期方法。 - **HttpServer1类**:实现一...
### Tomcat工作原理详解 #### 一、简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web开发之中。它不仅能够运行Java Servlet,还支持JSP技术...了解这些基础知识对于深入理解和使用Tomcat至关重要。
在Java中,Socket类封装了必要的信息,包括连接协议、IP地址和端口号,使得客户端和服务端能够进行有效的交互。 1. **Socket概念** - Socket,也称为套接字,是网络通信中的一个抽象概念,它是两个网络进程间通信...
Java提供了丰富的网络编程API,如Socket和ServerSocket类,用于实现客户端和服务器之间的通信。还可以使用URL和URLConnection类来访问网络资源。 **7. Java数据库连接(JDBC)** Java Database Connectivity (JDBC)...
- **Socket通信**:学习TCP和UDP的网络通信模型,掌握Socket和ServerSocket的使用。 - **HTTP协议**:了解HTTP的基本概念,如何发送GET和POST请求。 8. **Apache相关技术** - **Tomcat服务器**:安装配置Tomcat...
- 使用Swing和MySQL构建一个学生成绩管理系统。 - 涵盖需求分析、系统设计、数据库设计、编码实现等软件工程过程。 - 实现功能包括密码修改、新生报到、基本信息查询、成绩查询等。 - **广陵学院图书馆管理系统*...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括基础语法、面向对象、集合框架、多线程、异常处理、JVM内存管理、IO流、网络编程、设计模式、Spring框架、Struts框架、Tomcat服务器等。以下是对这些...
此外,了解类、对象和封装的概念,以及如何使用继承和多态性来实现面向对象编程。 2. **集合框架**:Java集合框架是处理对象数组的强大工具,包括List、Set和Map接口,以及ArrayList、LinkedList、HashSet、HashMap...
7. **网络编程**:Java提供了Socket和ServerSocket类进行网络通信。学习如何创建客户端和服务器端的连接,进行数据的发送和接收。 8. **Java应用程序和Web应用程序开发**:Java可以开发桌面应用程序,也可以通过...
Java多线程TCP Socket服务器源码是用于构建高性能、可扩展网络服务的基础,尤其是在...通过对这些源码的学习和分析,开发者可以深入理解Java多线程TCP服务器以及FastCGI协议的实现细节,从而提升网络服务开发的能力。
10. **网络编程**:Java支持TCP和UDP网络通信,可以创建Socket和ServerSocket进行数据交换。 11. **JDBC**:Java Database Connectivity,用于连接和操作数据库,包括连接、查询、事务处理等。 12. **设计模式**:...
- **封装、继承和多态**:面向对象的三大特性,封装保护数据,继承实现代码复用,多态提供灵活性。 - **异常处理**:Java强制使用try-catch-finally语句块处理异常,确保程序的健壮性。 - **垃圾回收机制**:自动...
此外,笔记中还包含了对Tomcat服务器的介绍和使用。Tomcat是一款轻量级的Java Web应用服务器,是初学者部署和运行Servlet、JSP应用的首选。这里将讲解如何安装配置Tomcat,创建Web项目,以及如何发布和调试应用。...
- **Socket编程**:了解TCP和UDP协议,学会使用Socket和ServerSocket进行网络通信。 - **HTTP协议**:理解HTTP请求和响应的结构,以及HttpClient库的使用。 10. **Java虚拟机(JVM)** - **内存模型**:了解堆、...
10. **Web开发**:如果书中涉及Web项目,那么你可能会看到关于Servlet、JSP、Filter、Listener等Web组件的使用,以及如何结合Tomcat服务器运行和部署Java Web应用。 通过深入研究这些源代码,你不仅可以提升Java...
1. 监听套接字:使用`java.net.ServerSocket`创建一个监听特定端口的服务器,等待客户端连接。 2. 处理线程:每当有客户端连接时,服务器会创建一个新的线程来处理请求,避免阻塞其他客户端。 3. HTTP解析:接收...
777意味着文件或目录对所有用户都有读、写和执行权限,这是最开放的权限设置,通常不推荐在生产环境中使用,因为这可能会导致安全问题。 #### 3. final、finally与finalize的区别 - **final**:修饰符,可以用于...