我的SOCKET服务器通信是这样的:
函数1:
public class Connectors extends Thread {
  public Connectors(ConnectPara para) {
    start();
  }
  public void run(){
    //int count=0;
    try{
      ServerSocket serversocket  = new ServerSocket(m_para.ListenPort);             
      while(true){
        Socket socket=serversocket.accept();
        //  启动连接服务进程
        if(m_para.CheckAccess(socket)){
               new Connector(socket,m_para);
        }
        else{
            socket.close();
        }
      }
    }catch(Exception e){
       e.printStackTrace();
    }
  }
}
函数2:import java.io.*;
import java.net.*;
import java.util.*;public class Connector extends Thread{

  /** 网络连接*/
  private Socket socket;  /** 网络输入数据流*/
  private InputStream in;
  /** 网络输出数据流*/
  private OutputStream out;
  /** 构造函数*/
  public Connector(Socket s,ConnectPara para){
    socket=s;
    
    m_para=para;
    try{
      socket.setSoTimeout(600);//超时时间
      in=socket.getInputStream();
      out=socket.getOutputStream();
      start();
    } catch(Exception e){
      if(QuietMode==0){
e.printStackTrace();
      }
    }
  }  public void run(){
    actived=1; 
    try{    
      byte[] tmp=new byte[3652];
      byte[] buf=new byte[3652];
      int count=0,received=0; 
      while(true){
     try{
          System.out.println("开始读取");//这行打出来了
       count=in.read(tmp,0,3652);//此处死了,执行到此处就不往下走了!是否跟Socket通信函数读取器有关系????
          System.out.println("结束读取");//这行没打出来
         received+=count;  
     }catch(Exception e){
       e.printStackTrace();
       break;
     }       
      }
      
        buf="fdsafds".getBytes();
        out.write(buf);
         out.flush();             } catch(Exception e){   
      e.printStackTrace();      
      actived=0;         
    }
  } 
}
-----------------------
客户端是这么掉用的:
public  String send(String sendstring)throws Exception{
String returnstring = "";
try{
//新建Socket通信
Socket socket = new Socket(ip,port);
//通信输出字节流
OutputStream out = socket.getOutputStream();
    out.write(sendstring.getBytes("GBK"));
    out.flush();
    log.info("send:"+sendstring);
    
    //-----------开始接收-------------
    byte[] buf = new byte[65536];
    InputStream in=socket.getInputStream();
    int count = in.read(buf);
    returnstring = new String(buf,"GBK");
    System.out.println(returnstring);
    }catch(Exception e){
     e.printStackTrace();
    }
    return returnstring ;
}-------------
问题如下:
  正常情况下能进行通信,但每回新建立连接时第一次服务器就读取不到数据,接下来可以读取!
  有人遇到过这种问题么???
  一般第一次服务器启动时才会出现,问题在服务器端的Connector下的读取器死了,出不来了!!!

解决方案 »

  1.   

    没有道理啊,按理说是读到了多少都会返回的,你把你的那个read方法改成read(byte[] data)的方法,也就是不要指定它从哪读到哪就可以了
      

  2.   

    client端发送的数据长度不够3652吧
    改  count=in.read(tmp);试试
      

  3.   

    String   returnstring   =   " "; 
    out.write(sendstring.getBytes( "GBK ")); 你传了一个空字符串过去,但是在你的服务器端却要指定接收从0开始的3652字节的数据
    服务器没有读完3652字节数据前是一直处于阻塞状态的,当然没有响应了一般来说传TCP数据的话,最好制定一个消息协议
    比如,一次传送的数据包开头的4字节指定需要传送的数据大小,接下来跟着是数据部分
    服务器先接收数据包大小信息,然后以1024单位循环读取数据包
    这样才不容易造成服务器端的阻塞假死
      

  4.   

    更正一下楼主的:
    我传入的是sendstring(这是参数传入的),而returnstring是返回的数据.
    ---------------------------------------------------------
    我自己开两个Ecplise测试了一下,还是不行,并且会出现这种情况:
              客户端传入数据较大时,但没有超过服务器接收的最大长度,此时服务器端会将数据分开来接收,也就是说一次只接收传入的部分数据,如以下调试结果所示: 
    服务器:
    开始接收数据
    接收到了:4380个字节数据.
    开始接收数据
    接收到了:526个字节数据.
    ---------
    客户端:
    发送长度:4906字节
    返回数据:526字节-------------------------------------------------------
    求高手们帮帮我看看这种传送机制到底会有什么问题???
    楼上说的机传输机制怎么实现呢?以前没做过,只做过这种简单的
      

  5.   

    你的程序最根本的问题就是你在建立连接以后,没有明确这个连接所能发送的数据,你在客户端在发完之后,并且没有close掉,所以在你服务器的那一块,才会卡死在count=in.read(tmp,0,3652);
    因为服务器处理连接的线程并不知道这个socket怎么样了,所以它会一直尝试着从里面读取数据,直到你设了超时的话,到了超时为止,或者你没有设超时的话,就直到socket关闭为止,它才会返回.你应该在客户端发完数据后再调用一下,socket.close(),把这个socket关了,然后服务器那边读的等待方法会抛出一个异常,你捕获这个异常就可以了
      

  6.   

    按照楼上的方法的话,如果我客户端发送后就关闭了,那么我怎么能收到服务器返回的数据呢???对于服务器端来说,虽然可以接收刚关闭的客户端数据,但服务器端怎么能返回数据呢???不会再新建一个Socket吧???