如题:例如80端口。
默认情况下80端口是HTTP协议,我想对此端口进行监听,看对方发送什么请求。如果是我想要的请求,那么就做一些操作。
此变态要求完全是因为我买的主机不支持自己开设端口,否则我就用socket了,请知道的大侠帮帮忙,小弟不胜感激!!说个思路也可以!!!
默认情况下80端口是HTTP协议,我想对此端口进行监听,看对方发送什么请求。如果是我想要的请求,那么就做一些操作。
此变态要求完全是因为我买的主机不支持自己开设端口,否则我就用socket了,请知道的大侠帮帮忙,小弟不胜感激!!说个思路也可以!!!
如果你机器上没有运行web服务器,或者其他监听80端口的服务,那么它就是一个普通的端口。你可以像监听普通端口一样监听它。
但是如果它已经被使用了,那你就不能监听它了。
//运行状态
volatile boolean running;
ServerSocket server;
//监听端口
int serverPort;
//最大连接数
int backlog; static ServerSocketService instance; ServerSocketService () {
super();
} public static ServerSocketService getInstance() {
if (null == instance) {
init();
} return instance;
} private synchronized static void init() {
instance = new ServerSocketService();
instance.serverPort = new Integer(OAMConfig.getItemValue("Alert","omcAlertAcceptPort")).intValue();
instance.start();
} public void destroy() {
if (server != null) {
try {
server.close();
} catch (IOException e) {
TraceService.trace(LogConstants.ALERT,
this.getClass().getName() + "I/O流出现异常" +
e.toString());
}
}
running = false;
interrupt();
} public void run() {
if (running) {
return;
} running = true;
try {
while (running) {
server = new ServerSocket(serverPort);
try {
Socket accept = null;
while (true) {
// 以线程方式处理请求
accept = server.accept();
TraceService.trace(LogConstants.ALERT,this.getClass().getName()+
new StringBuffer("接受来自").append(
accept.getInetAddress().getHostName())
.append(':').append(accept.getPort())
.append("连接").toString());
new Thread(new ServerSocketHandler(accept)).start();
}
} catch (Exception e) {
TraceService.trace(LogConstants.ALERT,this.getClass().getName() +
"接收ServerSocketHandler对象出现异常: " + e.toString());
}
}
} catch (IOException e) {
TraceService.trace(LogConstants.ALERT,this.getClass().getName() +
"create server socket failed !" + e.toString());
} finally {
running = false;
}
}
/**
* @return the backlog
*/
public int getBacklog() {
return backlog;
}
/**
* @return the serverPort
*/
public int getServerPort() {
return serverPort;
}}/////////调用下面的ServerSocketHandler.javapublic class ServerSocketHandler implements Runnable {
Socket socket;
boolean close;
final Calendar aliveTime = Calendar.getInstance();
public ServerSocketHandler (Socket socket) {
this.socket = socket;
} /*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
while (true) {
try {
if (socket != null && socket.isConnected()) {
synchronized (socket) {
handlerMessage();
}
} else {
close = true;
}
} catch (IOException e) {
TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "I/O异常:"+
e.toString());
}
if (isAlive()) {
// 如果socket无效,关闭socket终止线程
close();
break;
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "休眠异常:" +
e.toString());
}
}
} /**
* 判断socket是否有效
*/
private boolean isAlive() { boolean result = false;
if (close) {
// 需要关闭或端口发生改变
result = true;
} else if (aliveTime.before(Calendar.getInstance())) {
// 有效时间在当前时间之前
result = true;
}
return result;
}
/**
* 从套接字中读取消息,并响应
*
* @throws IOException
*/
private void handlerMessage() throws IOException {
BufferedInputStream is = null;
is = (BufferedInputStream)socket.getInputStream();
//这个为我自己的类,用来接收流信息
KernelReport4Alert msg = new KernelReport4Alert();
msg.doTask(is);
} /**
* 关闭socket连接
*/
private void close() {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "socket关闭异常:" +
e.toString());
}
}
socket = null;
close = false;
}
}