分类: Java
2008-04-25 15:39:34
考虑到安全性的原因,只能由applet发起一个套接口连接,因此servelt是一个被动的监听的方式,一个servlet必须在某个端口监听,等待applet的连接请求。通常情况下,一个servlet应该在servlet的init()方法中开始监听applet的连接请求,并在destroy()方法中停止监听。在这两者之间,对每个连接请求都创建一个线程来和客户端进行通信。
由于通过套接口的每一个请求都要建立一个线程来处理,而java不支持多继承,因此我们单独作一个类来处理servlet与线程:
// cuugHttpServlet.java
package cuug;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public abstract class cuugHttpServlet extends HttpServlet {
protected int DEFAULT_PORT = 1313 ;
private Thread cuugThread;
public void init(ServletConfig config) throws ServletException{
super.init(config);
try{
cuugThread = new CuugTD(this);
cuugThread.start();
}
catch (Exception e){
getServletContext().log(e,"problem starting socket
server cuug thread");
}
}
protected int getSocketPort(){
try{
return Integer.parseInt(getInitParameter("socketPort"));
}
catch(NumberFormatException e) { return DEFAULT_PORT;}
}
abstract public void handleClient(Socket client);
public void destroy(){
try{
cuugThread.stop();
cuugThread = null;
}
catch(Exception e){
getServletContext().log(e,"Problem stoping
server Socket cuug thread");
}
}
}
class CuugTD extends Thread{
private ServerSocket serverSocket;
private cuugHttpServlet servlet;
public CuugTD(cuugHttpServlet servlet){
this.servlet = servlet;
}
public void run(){
try{
serverSocket = new ServerSocket(servlet.getSocketPort());
}
catch(Exception e){
servlet.getServletContext().log(e,"Problem establishing
server socket");
return;
}
try {
while(true){
try{
servlet.handleClient(serverSocket.accept());
}
catch(IOException ioe){
servlet.getServletContext().log(ioe,"Problem
accepting client's socket connection");
}
}
}
catch (ThreadDeath e){
try{
serverSocket.close();
}
catch(IOException ioe){
servlet.getServletContext().log(ioe,"Problem
closing server socket ");
}
}
}
}
//DaytimeServlet.java
import java.io.*;
import java.net.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import cuug.cuugHttpServlet;
public class DaytimeServlet extends cuugHttpServlet{
public Date getDate(){
return new Date();
}
public void init(ServletConfig config)throws ServletException{
super.init(config);
}
public void doGet (HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
if ("object".equals(req.getParameter("format"))){
ObjectOutputStream out = new
ObjectOutputStream(res.getOutputStream());
out.writeObject(getDate());
}
else{
PrintWriter out = res.getWriter();
out.println(getDate().toString());
}
}
public void doPost (HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
doGet(req , res);
}
public void destroy(){
super.destroy();
}
public void handleClient(Socket client){
new DaytimeConnection(this ,client).start();
}
}
class DaytimeConnection extends Thread {
DaytimeServlet servlet;
Socket client;
DaytimeConnection(DaytimeServlet servlet ,Socket client){
this.servlet = servlet ;
this.client= client;
setPriority(NORM_PRIORITY-1);
}
public void run(){
try{
DataInputStream in = new DataInputStream(
new BufferedInputStream(
client.getInputStream()));
String line = in.readLine();
if ("object".equals(line)){
ObjectOutputStream out =
new ObjectOutputStream(client.getOutputStream());
out.writeObject(servlet.getDate());
out.close();
}
else{
PrintStream out = new PrintStream(client.getOutputStream());
out.println(servlet.getDate().toString());
out.close();
}
client.close();
}
catch(IOException e){
servlet.getServletContext().log(e,"IOException while
handling request");
}
catch(Exception e){
servlet.getServletContext().log(e,"Exception while
handling request");
}
}
}