我现在要作这么个东西,用socket实现的:1:client向server发登录消息,server进行验证后,向客户端发送“登录成功”,并保留这个socket2:server会随时使用这个socket向client发送数据消息3:每隔5分钟,client向server发一个验证消息,保证网络连接正常现在我作到server完成身份验证就作不下去了,不知道怎么实现server随时使用socket向client发数据的功能?是在client弄一个
while(true){
    String str = in.readLine();
    if(str == null)
        break;
}
这样吗?请各位为小弟指点一二!

解决方案 »

  1.   

    这个是长连接, 那么用TCP连接.
    2:server会随时使用这个socket向client发送数据消息 
    可以使用一个随机时间, 然后Server在发送一次数据后, 休眠随机长的时间while (!stopped) {
            server写数据给client.
            int delay = (int)(Math.random() * 3000); // server随机休眠3000毫秒以内
            Thread.sleep(delay);
    }自己处理一下异常.3:每隔5分钟,client向server发一个验证消息,保证网络连接正常 
    当client收到一个从server来的消息时, 结束上一Timer, 启动一个新的记时器Timer, 设置时间为5分钟.
    5分钟后, Timer发送消息给server, 如果在一写时间内client没有收到server的回复信息, 则说明连接断了.
      

  2.   

    每隔5分钟向客户端发送一个消息可以用定时器来实现
    个人不推荐使用socket,虽然socket也能实现
    但是,更推荐rmi,你可以调用java中的rmi来实现客户端和服务器之间的通信,非常方便
    当客户端向服务器发登陆消息,服务器进行验证后,将这个客户端对象放入一个队列中,以后从这个队列中取出每个客户端对象,服务器通过这个客户端对象向客户端发送消息,当然,为此你必须得做两个监视器,一个是监视服务器,一个是监视客户端的,当事件发生时,监视器接收到消息,并做出响应处理。
    具体的,你可以看下用java做的网络聊天室,很多书上都有这样的例子的
      

  3.   

    2:server会随时使用这个socket向client发送数据消息 这个要求你的客户端必须采用2个线程,一个用于接收Server发来的数据,另一个负责发送数据。
    这样,读取互不干扰,可以同时运行。
    3:每隔5分钟,client向server发一个验证消息,保证网络连接正常 
    这个如果要求不严格,可以让client休眠5分钟
    Thread.sleep(300000);
    然后发送数据就可以了。
      

  4.   

    用socket也有socket的好处
    登录成功的用户可以每次发送时加上验证信息,可以考虑加密
    例子可以参考oreilly的Java in a Nutshell,电子版
    如果随便写的话,就像whmjxa说的那样,可以考虑使用rmi,而且安全方面可以由rmi负责
      

  5.   

    在服务端吧这个socket包装一起来 写个方法:
    public void write(String str);
    里面利用socket.getOutPutStream()来向客户端写数据.这样 在你需要发送的时候直接调用socket包装对象.write()方法写就可以了,这个socket会一直连接着的,不需要什么死循环.在客户端 单独开一个线程用来读取信息 用BufferedRead来包装socket.getInPutStream(),调用BufferedRead中的readLine()就可以了,因为socket.getInPutStream()是阻塞调用的 ,所readLine()也会是阻塞调用的,会一直等到服务器端传送来一个换行标志才会返回,不需要死循环来读.客户端做个定时器 每次接受到服务器数据了就把定时器置0,定时器到时间了就断开连接.(javax.swing.Timer 类就是现成的定时器 可以看下doc文档,上面有例子 很方便 实现一下ActionListener接口就可以)
      

  6.   

    感谢各位的指点,请看我现在的实现哪里有问题?            while (true) {
                    socket = serverSocket.accept();
                  System.out.println("已经建立socket链接!");
                    
                  //接收数据
                    DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
                    
                    //数据处理
         String messageStr = this.processInputStream(dis);
         System.out.println("收到字串:" + messageStr);
        
         Message message = createMessageObject(messageStr);
                    
         if (message.getCommand().equalsIgnoreCase("S C")) {
    // 登录报文
         System.out.println("收到登录报文:" + messageStr);
        
         //构造响应报文
    String ret = createLoginReturnStr();
    System.out.println("响应登录报文:" + ret); DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    out.write(EncodeUtil.encode(ret).getBytes());
    out.flush();

    }
    else if(message.getCommand().equalsIgnoreCase("S A")){
    //链路维护报文
    String ret = messageStr;
    System.out.println("响应链路维护报文:" + ret); DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    out.write(EncodeUtil.encode(ret).getBytes());
    out.flush();
    }                System.out.println("接收完成!");
                }
    client端:     //构造登录对象
         String loginStr = this.getLoginStr();
        
         cs.sendMessage(loginStr);
        
    String ret = cs.getMessage();
                    if(something){
                        System.out.println("登录成功!");
                    }问题是到这儿了我就不知道怎么继续接收server端发来的数据了???链路维护的问题:我的client程序extends TimerTask了,在run中这样写了:
         //构造登录对象
         String linkTestStr = this.getLinkTestStr();
         cs.sendMessage(linkTestStr);
        
    String retStr = cs.getMessage();
    在main()中这样写:
            Timer timer = new Timer(false);//设置定时器
            timer.schedule(new ShenyangClient(), 1000,5000); //1秒后开始运行,每5秒运行一次但运行时就总是不动了,CPU也一直很高,不知道是怎么回事?
      

  7.   

       while (true) { 
                    socket = serverSocket.accept(); 
                  System.out.println("已经建立socket链接!"); 
    这段代码有点问题,你使用建立一次连接还要建立很多次呢,在一个单独的线程里不断的进行监听意味着将创建出多个连接,我想程序动的原因就在这里,你知创建了一个client端,那server完成了一次while循环后又开始监听了,这时没有client请求,sever就下不去了,不断的在监听着!!!
    cup高可能是client端引起的,sever在监听的时候没有那么占cpu
      

  8.   

    因为我希望在server中收到多个消息啊,第一个是登录,之后还有业务数据,链路信息等。如果不用while(true),不是收到一个就结束了?
      

  9.   

    一旦登录成功之后,server端的socket是一直保留的,还要用它向client发东西
      

  10.   

    现在我遇到的新问题:我在client和server端分别通过socket的inputStream和outputStream互发数据。server端使用了一个TimerTask控制定时发送数据,在run中使用outputstream向client发送数据。client端也同样使用一个TimerTask定时向server发链路维护消息,也是使用outputstream向server发数据。但在运行时,总是server不断地发,而client只发出了第一条就停住了。client定时发的消息也没有发出去
    这是怎么回事啊?
      

  11.   

    建议使用rmi进行网络通信,刚刚用过了下,觉得很方便