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();
}
}
}
分享到:
相关推荐
clientsocket and serversocket
有一点需要声明,《深入剖析tomcat》是以tomcat4为样本进行分析的,版本老了一点,但大体的设计思想并不会有太大的变化。 二、模块介绍 2.1、simple_tomcat01 一个简单的程序,只是创建一个ServerSocket,监听8080...
下面小编就为大家带来一篇JAVA-NIO之Socket/ServerSocket Channel(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本资源是java中socket与serverSocket连接的例子,包括客户端和服务器端的程序代码
聊天套接字Java版本0.1 聊天室(LAN)演化服务器ServerSocket和Socket Java语言。... 请使用API java.net中的实用程序,以及使用ServerSocket类和本地服务对象类创建的类。 使用线程,可以并行处理界面GUI。
Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建 立基于UDP协议的网络通信
serversocket web服务器
ServerSocket,ClientSocket控件源码,讲述内部实现原理
聊天室基于socket,serversocket,实现保存,查看聊天记录的功能
tomcat的版本4和版本5 2 章节简介 2 第1章 一个简单的Web服务器 3 1.1 The Hypertext Transfer Protocol (HTTP) 3 1.2 HTTP Request 3 1.3 HTTP Response 4 1.4 Socket类 4 1.5 ServerSocket类 5 1.6 应用举例 5 第2...
socket和serversocket利用IO流编写的多线程连接相互发送消息
ServerSocket的close()方法使服务器释放占用的端口,并且断开与所有客户的连接。当一个服务器程序运行结束时,即使没有执行ServerSocket的close()方法,操作系统也会释放这个服务器占用的端口。因此,服务器程序并不...
SE320-Final-Assignment:包含ServerSocket代码以及LinearSearch代码
Socket+ServerSocket代码
恢复DELPHI 6 以后 无 SERVERSOCKET和CLIENTSOCKET控件包
BCB6中ServerSocket控件的使用 & XRF日本理学荧光SMX14仪器数据采集 1、ServerSocket控件
基于B/S的,利用io输出流输入流。基于图形界面
Java 实例 - ServerSocket 和 Socket 通信实例源代码+详细指导教程.zip
一个简单的Android平台的ServerSocket样例。同一个局域网的手机可以通讯
a) 使用ServerSocket、Socket完成服务端和客户端的连接。 b) 服务端使用多线程的方式可以接受多个客户端。 c) 使用对象的方式,在服务端和客户端之间传送数据。