免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1745 | 回复: 0
打印 上一主题 下一主题

ServerSocket多线程通信服务程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-05 01:17 |只看该作者 |倒序浏览

在开发基于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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP