blob: 9279e22fa6dc193cbaa1400a8a56c47455b04f68 [file] [log] [blame]
/****************************************************************
* This work is derived from 'jnamed.java' distributed in *
* 'dnsjava-2.0.5'. This original is licensed as follows: *
* Copyright (c) 1999-2005, Brian Wellington *
* All rights reserved. *
* *
* Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the *
* following conditions are met: *
* *
* * Redistributions of source code must retain the above *
* copyright notice, this list of conditions and the *
* following disclaimer. *
* * Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the *
* following disclaimer in the documentation and/or other *
* materials provided with the distribution. *
* * Neither the name of the dnsjava project nor the names *
* of its contributors may be used to endorse or promote *
* products derived from this software without specific *
* prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR *
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR *
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT *
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
* POSSIBILITY OF SUCH DAMAGE. *
* *
* Modifications are *
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
package org.apache.james.jspf.tester;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public final class TCPListener implements Runnable {
private final static class TCPServer implements Runnable {
private final Socket serverSocket;
private ResponseGenerator responseGenerator;
private TCPServer(Socket s, ResponseGenerator rg) {
this.serverSocket = s;
this.responseGenerator = rg;
}
public void run() {
try {
int inLength;
DataInputStream dataIn;
DataOutputStream dataOut;
byte[] in;
InputStream is = serverSocket.getInputStream();
dataIn = new DataInputStream(is);
inLength = dataIn.readUnsignedShort();
in = new byte[inLength];
dataIn.readFully(in);
int length = in.length;
byte[] response = responseGenerator.generateReply(in, length);
if (response == null) return;
dataOut = new DataOutputStream(serverSocket.getOutputStream());
dataOut.writeShort(response.length);
dataOut.write(response);
} catch (IOException e) {
System.out.println("TCPclient("
+ serverSocket.getLocalAddress().getHostAddress() + "#" + serverSocket.getLocalPort()
+ "): " + e);
} finally {
try {
serverSocket.close();
} catch (IOException e) {
}
}
}
}
private final int port;
private final InetAddress addr;
private ResponseGenerator responseGenerator;
public TCPListener(InetAddress addr, int port, ResponseGenerator rg) {
this.port = port;
this.addr = addr;
this.responseGenerator = rg;
}
public void run() {
try {
ServerSocket sock = new ServerSocket(port, 128, addr);
while (true) {
new Thread(new TCPServer(sock.accept(), responseGenerator)).start();
}
} catch (IOException e) {
System.out.println("serveTCP(" + addr.getHostAddress() + "#" + port + "): "
+ e);
}
}
}