首先介绍下本人情况,一直是写PHP CODE, 最近公司需要JAVA编写多线程的server端,无奈只得去临时学了下,所以有些问题挺小白的,希望得到高人帮助

解决方案 »

  1.   

    这个是否是你想要的?这种模式应该没问题,我项目中如果简单的都会用这种模式,比较适合客户端,服务端一般用nio来处理,但基本上也是类似的。class Request implements Runnabek{
        OutputStream os;
        Queue<byte[]> queue;//用concurrent下面的类
        public void run(){
            while(true){
                // os().send(queue.pop());
            }
        }
        public synchronized void send(byte[] bs){
            queue.offer(bs);
        }
    }class Response implements Runnabek{
        IputStream is;
        byte[] cache = new byte[1024];
        public void run(){
            while(true){
                int len = is.read(cache);
                // handle(cache, 0, len);
            }
        }
    }new Thread(new Request(socket.getOutputStream())).start();
    new Thread(new Response(socket.getInputStream())).start();
      

  2.   

    我的思路是这样的,连接线程和处理线程分开,连接线程只负责接收包,当连接线程接受到数据包的时候立即向请求方发送一个“请求正在处理”的消息,然后将数据包再发给处理线程让处理线程做所有的逻辑处理,处理结束再由处理线程向请求方发送处理后的结果。_____________          ______________         _____________
    |           |          |            | request |            |
    |           |  to do   |            | <------ |            |
    |   处理    | <------  |    连接    |  wait   |    客户    |
    |   线程    |          |    线程    | ------> |    请求    |
    |           |          |            |   i'm   |            |
    |___________|          |____________|  doing  |____________
          |_____________________________________________Y
                         response:result
      

  3.   

    _____________          ______________         _____________
    |           |          |            | request |            |
    |           |  to do   |            | <------ |            |
    |   处理    | <------  |    连接    |  wait   |    客户    |
    |   线程    |          |    线程    | ------> |    请求    |
    |           |          |            |   i'm   |            |
    |___________|          |____________|  doing  |____________|
          |_____________________________________________Y
                         response:result
    上面的排版有点问题,这样看起来应该会好点
      

  4.   


    线程模型基本上不动了 因为要改的话 C++那边也需要做更改 这改动就有些太大了 现在的问题主要是在于request和response的分离我在想怎么样才能把request和response完全分离开来 写成2个相对独立的安全线程 这样保证server端正在响应一条请求的同时 不会生成新的response 也不会出现交替调用send方法的情况了
      

  5.   

    楼主的问题就是同步和异步问题。传统的socket是阻塞模式(同步),就是请求等待响应,在此期间这个请求必须等待到服务器的响应,才可以发送下一条请求。
    你可以去看看NIO异步socket通信
    那个玩意肯定适合你这个架构
      

  6.   


    谢谢你的回答 
    class Response implements Runnabek{
        IputStream is;
        byte[] cache = new byte[1024];
        public void run(){
            while(true){
                int len = is.read(cache);
                // handle(cache, 0, len);
            }
        }
    }我想问下 这个地方的Runnabek接口类 实现的方法是安全线程吗 意思就是说我不希望在同一时间存在2个response的线程...
      

  7.   


    谢谢 我去研究一下 JAVA才写了2个多星期 好东西都不是很了解
      

  8.   

    怪怪的哈,其实就是写两个类,一个类负责发,一个负责收。
    发送需要同步,调用send时,仅仅是把数据存储起来,不直接调用IO发送方法。类似生产者-消费者模式,这里仅有一个消费者,因此只需要在生产者调用的方法上加同步。
    接收本身不需要同步,因为你程序肯定要杜绝一个以上线程阻塞读IO,即这个从设计上肯定要保证仅一个线程在操作io.read(),所以无需同步。