mysocket = sk; 
      PrintWriter out = new PrintWriter(mysocket.getOutputStream(),false); 
      BufferedReader br = new BufferedReader(in); 
      //!!!!! in = new InputStreamReader(mysocket.getInputStream()); 
      //out.write(sendMsg); //通过 out向服务器写入信息。 
       out.println(sendMsg); 
      out.flush(); 
      out.close() //最好加上      in = new InputStreamReader(mysocket.getInputStream()); //放到这!!!
      strReceive = br.readLine(); 

解决方案 »

  1.   

    看妳的異常信息好像是創建Socket的時候出錯的與通信還沒有什麼關係
    妳可以debug一下看看
    Socket mySocket = new Socket(URL, port); 
      

  2.   

    mySocket 是关了,可sk没关,你服务器端socket关了,所以sk这边出错了, 
      

  3.   

    楼主的说法有道理,但是服务器端的程序没有问题,只是我们这边在接收的时候报错了,我试着在客户端循环读取的字节的方式组成最终的报文就没有错,但是那个长度条件非常关键。
    这是修改后的代码:
    public String MessageReceive(String sendMsg) {
    String strReceive = null;
    String strReceive1 = "";
    Socket mysocket;
    StringBuffer sb = new StringBuffer();
    InputStreamReader in = null;
    try {
    mysocket = sk;
    PrintWriter out = new PrintWriter(mysocket.getOutputStream(), false);
    //out.write(sendMsg); //通过 out向服务器写入信息。
    out.println(sendMsg);
    out.flush();
    in = new InputStreamReader(mysocket.getInputStream(), "gb2312");
    BufferedReader br = new BufferedReader(in);
    //strReceive = br.readLine();
    DataInputStream is = new DataInputStream(mysocket.getInputStream());

    int c = 0;
    int i_count = 0;
    int icount1 = 85; //错误反馈报文长度
    int icount2 = 102; //正常反馈报文长度
    while (((c = br.read()) != -1)) {
    strReceive = strReceive + (char) c;
    i_count = strReceive.getBytes().length;
    strReceive1 = strReceive1 + (char) c;
    if ((icount1 != 0 && i_count >= icount1) 
    || (icount2 !=0 && i_count >= icount2)) {
    break;
    }
    }
    mysocket.shutdownOutput();
    mysocket.close();
    return StringHelper.NullToSpace(strReceive1);
    } catch (SocketException e) {
    e.printStackTrace();
    return null;
    } catch (UnknownHostException e) {
    e.printStackTrace();
    return null;
    } catch (IOException e) {
    e.printStackTrace();
    return null;
    }
    }那个抛出异常的问题就解决了,但是我还是不明白这里的控制机制。请高人指点。
      

  4.   

    mySocket和sk指向同一个对象,你关了mySocket就是说mySocket对这个对象的一个引用关了,但是该对象并没有消失,因为sk还指向它,如果你把sk关了,也就是说没有人用这个对象了,这个对象就被销毁了,就不回报上述异常了