- 论坛徽章:
- 0
|
在开发基于TCP/IP协议的socket多线程程序中,服务端ServerSocket采用的主要做法,当然有些情况下还可以采用线程池方式实现.
/**
* 通信服务处理
*/
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;//日志
public class Rserver {
private static Logger logger = Logger.getLogger(Rserver.class.getName());
public Socket socket;
private ServerSocket s;
ServerThread st;//自实现线程类
//实现连接方法
public void connect(int port) {
boolean status=false;
try{
s = new ServerSocket(port);
System.out.println("Server Starting...");
logger.info("Server Starting...");
while(true) {
socket = s.accept();//接受客户端套接字,阻塞等待
//socket.setSoTimeout(60000);//设置连接超时
System.out.println("-----A Client connected!----");
logger.info("----a client connected----");
st = new ServerThread(socket);//有SOCKET连接,则启动一个新线程处理
st.start();
}
}catch(SocketTimeoutException ste){
st.interrupt();
System.out.println("超过等待时间,中断线程");
}
catch(IOException e){
e.printStackTrace();
}
}
/**
* 关闭SOCKET
*
*/
public void closeSocket(){
try {
s.close();
socket.close();
System.out.println("已经关闭!");
logger.info("服务已经关闭");
}catch(SocketException ser){
System.out.print("");
}
catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("socket 关闭异常!");
logger.info("通信服务关闭异常");
//e.printStackTrace();
}
}
/**
* 服务端主程序运行入口
* @param args
*/
public static void main(String args[]) {
Rserver pos = new Rserver();
pos.connect(10001);//连接端口
}
}
在对运行中的子线程,要从父线程终止不是那么容易的,比如当Rserver类被另外线程调用时候,要在另外线程中,中断Rserver中运行的ServerThread()线程,这个暂时还没怎么好做,我采用笨笨方式,直接调用关闭Rserver中的Socket的close()方法,让它抛出异常来结束.若有更好的方法希望以后补充进来.
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4985/showart_271129.html |
|