首先,我一直是从事C++编程工作,最近发现JAVA写一些网络相关的程序时工作效率特别高.所以想做一个JAVA方面的服务器.其中客户端有长连接,也有短连接向服务器请求数据. 客户端同时可能会有多个.以前我的C++的服务器设计方式是:
1.事先分配一个线程池,用于处理客户端请求;
2.一个线程专门用户的新连接加入到一个Socket链表,同时将断一的删除;
3.一个线程将各个客户端的数据加到数据请求链表;并同时将链表最后的数据让空闲的线程去处理.问题一. 不知道改成用JAVA来写是不是不用这么复杂的做了, 大家有什么好的设计方法?    这里要注意的是,有很多长连接也会连接到系统,如果一个SOCKET就开一个线程处理的话,SERVER端会有非常多的线程在运行. 而且经常线程创建关闭,是不是系统的效率也会变低?
问题二.如果用我上面的方式来做的法,客户端有新数据来的话有中断吗?(C++有),如果都要用查询方式的话,系统的效率和实时响应能力都会受到影响? 有什么好办法吗?

解决方案 »

  1.   

    看得出来楼主对于网络编程是有相当经验的。我本人做过一点网络编程方面的东西,谈不上什么经验,就楼主提出的问题,我简单说说我的感觉,谨供参考。> 问题一. 不知道改成用JAVA来写是不是不用这么复杂的做了, 大家有什么好的设计方法?用 Java 做 socket 编程,无非是 API 看起来更简洁一些,总的处理思路、设计方法什么的,跟 C++ 没什么大区别。感觉比较突出的一点就是“多线程”用起来特别简单。> 问题二.如果用我上面的方式来做的法,客户端有新数据来的话有中断吗?(C++有),如果都要用查询方式的话,系统的效率和实时响应能力都会受到影响? 有什么好办法吗?java.nio.channels.ServerSocketChannel 和 java.nio.channels.SocketChannel 可以用来进行多路异步通信,相当于“中断”吧。
      

  2.   

    谢谢 maquan('ma:kju) ( )的详细解答.编写完成后,可以把源码发给你,另外有其它有兴趣共同学习的CSDN网友,写下你的邮箱,完成后可以把代码发给大家共同学习.
      

  3.   

    maquan('ma:kju)已经总结的很好了,就不废话了
    ->这里要注意的是,有很多长连接也会连接到系统,如果一个SOCKET就开一个线程处理的话,SERVER端会有非常多的线程在运行. 而且经常线程创建关闭,是不是系统的效率也会变低?确实是有问题,所以还是应该使用线程池
      

  4.   

    感觉不就是个soap服务器吗?现成的软件一堆啊
      

  5.   

    TO: harshing(西边的太阳) 因为我初学JAVA,对JAVA的现有资源不是很了解,有相关的开源项目吗?
      

  6.   

    http://java-source.net/
    查看其中的Web Servers、Web Services
      

  7.   

    java的Socket封装得相当好了,不用像C++中还要考虑高低字节,sin_addr什么的了,基本的发送和接受报文像下面写就可以了:private Socket clientSocket;

    public SocketTools(Socket pm_oSocket)
    {
    clientSocket = pm_oSocket;
    }


    /*
     * @向Socket服务端发送报文
     * @Param pm_sMsg 报文信息
     */
    public void sendSocketMsg(String pm_sMsg)
    {
    try 
    {
    PrintStream ous = new PrintStream(clientSocket.getOutputStream());
    ous.println(pm_sMsg);
    }
    catch (IOException e)
    {
    System.out.println("Client:Socket发送报文错误");
    }

    }
    /*
     * 接收Socket服务端报文
     * return returnMsg
     */
    public String getServerMsg()
    {
    try 
    {
    BufferedReader ins = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    return ins.readLine();

    catch (IOException e) 
    {
    System.out.println("Client:Socket接收报文错误!");
    e.printStackTrace();
    return null;
    }

    }
      

  8.   

    学习!
    我写过一个很烂的 socket
    http://my.6cncn.cn希望共同学习!看看原代码吧
    [email protected]