One suggestion:
  Please comment out the db access part under Parameters.LOAD_LIST and send some garbage data out. See what will happen. I am suspecting the DB connection might mess up the socket based on your description.   It should not be that way. But...

解决方案 »

  1.   

    helpall兄这么晚了还在啊?我在loadList(**)这个方法里边,还有调用这个方法前后都加了debug输出语句了。
    好像直到reply()这个方法里边调用到clientSocket.getOutputStream()之前,一切都正常啊。输出的数据库查询结果也是正常。但是因为clientSocket并没有作为参数传递给其他任何方法,所以也就不能在这个过程中知道clientSocket的连接状态。
    难道要将clientSocket传进去测试吗?
    还有你说的DB connection might mess up the socket这个情况到底是怎么样的呢?
    能不能进一步解释一下?呵呵,我知道看代码是最头疼的啦。解决了另外开帖重谢啦。
      

  2.   

    我这里可能没有办法可以重现你的问题.我的意思是说你在做DB的操作之前看一看能不能clientSocket.getOutputStream().因为有时候DB会对SOCKET产生影响.(如:DB也要开SOCKET,如果你的通信与此SOCKET用同样的PORT...)如果你有简单的测试程序,我倒是可以实际做做. 现在只能是纸上谈兵了. 不好意思.
      

  3.   

    数据库操作影响到socket应该不会吧。以前也没有听说过这样的问题。而且问题是其他的类似操作都没有问题啊。真是奇怪。
      

  4.   

    千万别给我代码!我也没有遇到过这种问题. 我一般的做法是将它缩小成自己能解决的问题.一步步将可能出问题的地方排除.GOOD LUCK!
      

  5.   

    代码太多,看得太累拉,等有空在看吧,(大概非典过去了才有空,HOHO)呵呵
      

  6.   

    我也遇到类似的问题了,socket不知道为什么被关闭了
      

  7.   

    建议把使用这个参数的socket单独拿出来测试!
      

  8.   

    写了一个套接监视器用来测试class Monitor extends Thread
    {
      private Socket socket;
      private boolean isAlive = true;  public Monitor(Socket socket)
      {
        this.socket = socket;
      }
      public void terminate()
      {
        isAlive = false;
      }
      public void run()
      {
        System.err.println("套接监视器线程开始");
        if(socket != null)
        {
          int times = 0;
          while(isAlive)
          {
            System.out.println("套接已经被关闭? -- " + socket.isClosed()
                               + " -- 监视时间 -- " + times*20 + " 毫秒");
            try{
              Thread.currentThread().sleep(20);
            }catch(Exception e){e.printStackTrace();}
            times++;
          }
          System.err.println("套接监视器被终止");
        }
        else{
          System.err.println("套接为空");
        }    System.err.println("套接监视器线程结束");
      }
    }
      

  9.   

    这里监视到的信息:-------------------------------------------------------
    Server listening for incoming TCP connection on port 4225 ...TCP Connection received from: /127.0.0.1
    8971231312500
    1
    Login Message Received
    Login Authentication request from 1 with password 00650128
    ResultSet successfully queried
    PassCheck got : 00650128
    Password the same: Check successful!
    Process finished! Ready to send back reply
    Socket is closed: false
    OutputStream successfully got
    TCP Connection received from: /127.0.0.1
    Output sent
    8971231312500
    3
    Search Message Received
    Ready for new connections!
    Process finished! Ready to send back reply
    Socket is closed: false
    OutputStream successfully got
    Output sent
    Ready for new connections!
    TCP Connection received from: /127.0.0.1
    8971231312500
    7
    Load_List Message Received
    Ready to send the loaded list
    Client Socket Status: false
    套接监视器线程开始
    套接已经被关闭? -- false -- 监视时间 -- 0 毫秒
    套接已经被关闭? -- false -- 监视时间 -- 20 毫秒
    套接已经被关闭? -- false -- 监视时间 -- 40 毫秒
    LoadList()方法开始执行
    LoadList()方法关闭输入流
    LoadList()方法准备查询朋友ID
    LoadList()方法查询朋友ID的SQL语句: 
    SELECT friend_id FROM JavaMe.FriendList_Table WHERE id = 1
    LoadList()方法开始查询
    套接已经被关闭? -- true -- 监视时间 -- 60 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 80 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 100 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 120 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 140 毫秒
    LoadList()方法结束查询This user 1 has 1 friends in list
    1 has friend : 1 -- ID# 2
    After loading profile, we are sure the user 1 has 1 friends in list
    Load List sql query for reference:
    SELECT id, nickName FROM JavaMe.RegTable WHERE id = 2
    LoadList()方法准备再次查询朋友信息
    套接已经被关闭? -- true -- 监视时间 -- 160 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 180 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 200 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 220 毫秒
    LoadList()方法查询完毕
    Load List sql query for reference:
    SELECT ip, status FROM JavaMe.Status_Table WHERE id = 2
    LoadList()方法再次查询朋友IP
    套接已经被关闭? -- true -- 监视时间 -- 240 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 260 毫秒
    套接已经被关闭? -- true -- 监视时间 -- 280 毫秒
    LoadList()方法查询完毕
    127.0.0.1
    套接已经被关闭? -- true -- 监视时间 -- 300 毫秒
    1 Records of listed friends read
    LoadList()方法共查询到记录数: 1
    127.0.0.1
    套接已经被关闭? -- true -- 监视时间 -- 320 毫秒
    LoadList()方法输出流
    Client Socket Status: true
    Process finished! Ready to send back reply
    套接监视器被终止
    套接监视器线程结束
    Socket is closed: true
    IOException when sending replies
    java.net.SocketException: Socket is closed
            at java.net.Socket.getOutputStream(Unknown Source)
            at ClientMessageHandler.reply(ClientMessageHandler.java:183)
            at ClientMessageHandler.run(ClientMessageHandler.java:150)
    Ready for new connections!
      

  10.   

    监视的那部分:// load friend list
              case Parameters.LOAD_LIST:
                Monitor m = new Monitor(clientSocket); // 新建monitor
                m.start(); //开始监视
                System.err.println("Load_List Message Received");
                dos.writeInt(Parameters.LOAD_LIST);
                System.err.println("Ready to send the loaded list");
                System.err.println("Client Socket Status: " + clientSocket.isClosed());
                byte [] data2 = FriendList.loadList(dataInput).toByteArray();
                System.err.println("Client Socket Status: " + clientSocket.isClosed());
                dos.write(data2);
                m.terminate(); //结束监视
                break;
      

  11.   

    你在client中发完请求直接关闭连接,当然出错了!!!!
      

  12.   

    ??????
    你在client中发完请求直接关闭连接,当然出错了!!!!
    --------------------------------没有啊。
      

  13.   

    mercury1231兄:
      这样试试:
      1. 在socket建好后,先不要建数据库连接,看一看此socket的两端端口.
      2. 不建你的socket,只建数据库连接,看一看数据库的端口情况.
    我的怀疑是数据库的socket把你的socket破坏了(不太可能?).
      

  14.   

    不好意思,只能帮你up一下。  我不是做Java的,所以如果具体细节,我就一般不是很关心和清楚了。
      

  15.   

    netstat -a 看看当前的网络情况,可能有点帮助吧。
      

  16.   

    是不是,用法上不妥?
    这个程序,到底是充当什么?监听(ServerSocket),还是请求(socket)用的?看了代码,有点糊涂啊!!!
      

  17.   

    这个“套接监视器”不是程序的一部分,主要是用来debug时监视程序进程中套接的状态的。从而知道到底什么时候套接断开了。本来的程序是服务器端用来接收客户端连接请求后,处理套接,得到传入的信息请求,然后根据请求种类,分别处理。
      

  18.   

    算啦,为了做个及时揭帖的榜样,我现在就揭帖啦。
    如果有那位大哥对所给分数不满,先说抱歉啦。
    可以到下面这个帖子去抢点分,哈哈:)
    http://expert.csdn.net/Expert/topic/1756/1756989.xml?temp=.2653009