你的winsock写的有问题,因为socket数据都有缓存,数据量小必须手动flush

解决方案 »

  1.   

    多谢,请问winsock的flush操作用哪个函数实现?
      

  2.   

    asklxf(xuefeng):
    如果是winsock的缓存的原因,那是不是写一个winsock对winsock的程序也要flush呢?楼主:
    可否描述清楚一点,关闭之后服务器的sock得到的是什么?是不是-1?如果是的话,这只是听到客户端关闭了而已。要么看看你的核心代码。
      

  3.   

    客户端关闭连接后,服务器才收到客户端发送过来的数据.我也觉得是缓存引起的原因,但是,如果服务器端也用winsock写,则可以正常收到winsock客户端的数据,这点也使我感到不明白.
      

  4.   

    如果用java写一个socket 客户端,通信是正常的.
      

  5.   

    照理说,socket应该是独立的,和具体的实现方式没有关系啊。楼主还是把代码贴出来看看吧。
      

  6.   

    事实就是客户执行关闭连接时才收到从client发送过来的数据.server端主要代码如:
    public ServerThread(Socket s) { // serverThread构造方法
        this.clientRequest = s; // 接收receiveServer传来的套接字
        InputStreamReader reader; // 声明读数据类型
        OutputStreamWriter writer; // 声明写数据类型
        try { // 初始化输入、输出流      reader = new InputStreamReader(clientRequest.getInputStream());
          writer = new OutputStreamWriter(clientRequest.getOutputStream());
          input = new BufferedReader(reader);
          output = new PrintWriter(writer, true);    }
        catch (Exception e) {
          System.out.println(e.getMessage());
        }
     
      }  public void run() { // 线程执行方法
        String command = null; // 客户指令(客户端传送的数据)
        String str = null;
        boolean done = false;    while (!done) {      try {        str = input.readLine(); // 接收客户端指令
            System.out.println("接收到:"+str);
          }
          catch (IOException e) {
            System.out.println(e.getMessage());
          }
          command = str.trim().toUpperCase();
          if (str == null || command.equals("QUIT")){
            output.println("结束操作!");
            done = true; // 命令QUIT结束本次连接
          }
          else // 命令HELP查询本服务器可接受的命令
          if (command.equals("HELP")) {
            output.println("帮助操作!");
            output.println("query");
            output.println("quit");
            output.println("help");
            
          }
          
          else
          if (!command.startsWith("HELP") &&
              !command.startsWith("QUIT") &&
              !command.startsWith("QUERY")) {
            output.println("Command not Found! Please refer to the HELP!");
            
          }
        } // end of while
        try {
          clientRequest.close(); // 关闭套接字
        }
        catch (IOException e) {
          System.out.println(e.getMessage());
        }
        command = null;
      } // end of run}
      

  7.   

    应该不存在这种问题吧,不过试试在JAVA读数据完毕后进行flush操作
      

  8.   

    to:NetSniffer
    JAVA读数据完毕后进行flush操作,有没有代码参考一下,我没发现java的输入流读取对象有flush()这个函数,我用的是BufferedReader.
      

  9.   

    pb客户端代码:Blob bufulong ulAddrint r;
    //创建流式Socket 
    sClient=Create SocketStream ulAddr=ws.inet_addr("192.168.1.97") 
    //服务器地址 
    r=sClient.wsconnect(ulAddr,8080)
    If r=-1 Then//连接到服务器的8080号端口 
    MessageBox("Socket","连接服务器失败"+String(r)) 
    End If buf=Blob(Space(256))//定义缓冲区大小//将mle_1中的内容放入发送缓冲区buf=Blob(sle_1.Text)  
    //将buf中的内容发给对方 
    sClient.send(buf,Len(buf),0) //到这里加入下面关闭连接代码服务器端才可以收到要发送的数据
    //sClient.closesocket();