当客户端线程休眠时,Socket只接收所有数据?

时间:2014-03-18 18:49:58

标签: java sockets streamwriter thread-sleep printwriter

我想将字节从我的客户端传输到我的服务器。所以我创建了一个PrintWriter来告诉服务器,新数据即将到来以及它将会持续多长时间。服务器现在从StreamWriter获取发送的字节!只要我在发送字节之前将线程设置为休眠100毫秒,它就能很好地工作。但我想知道为什么?客户端是Android设备!它也无法与慢速互联网连接...我希望有人可以告诉我我的错误!非常感谢!

在客户端(发送):

client = new Socket("SERVER_IP", 2411);
                    //client = new Socket ("chatblack.de",2411);
                    reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
                    writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
                    streamer = new PrintStream(client.getOutputStream());
public void sendBytes(final byte[] toSend, int cID, int chunkID)
                      {
                          streamIsFree = false;
                         int length = toSend.length;
                         writer.println("DATA#"+cID+"#"+chunkID+"#"+length);
                         writer.flush();                     
//                               try 
//                           {
//                              Thread.sleep(1000);
//                          } catch (InterruptedException e1) {
//                              // TODO Auto-generated catch block
//                              e1.printStackTrace();
//                          }

                        try 
                            {
                                streamer.write(toSend);
                                streamer.flush();
                            } 
                                 catch (IOException e) 
                                 {
                                    e.printStackTrace();
                                 }

                                 streamIsFree = true;
                                 System.out.println("Stream is free now!");
                    }
服务器端的

String nachricht;
boolean fileTransfer = false;

                    try {
                            while((nachricht = reader.readLine()) != null) 
                                {

                                  if(nachricht.startsWith("DATA"))
                                  {
                                      fileTransfer = true;
                                   //   writer.println("DATA#"+cID+"#"+chunkID+"#"+length);  sendet der Client!
                                    //  writer.println("DATA#"+cID+"#"+chunkID+"#"+length);
                                      String out =  uName+": DATA MESSAGE: "+nachricht;
                                      System.out.println(out);
                                      int cID = Integer.parseInt(nachricht.split("#")[1]);
                                      int chunkID = Integer.parseInt(nachricht.split("#")[2]);
                                      int length = Integer.parseInt(nachricht.split("#")[3]);
                                      byte[] buffer = new byte[length];

                                      System.out.println(uName+": recieving Data: "+buffer.length);
                                      byte[] data = getDataStream(length);
                                      ssc.bytesInput(cID, chunkID, data);
                                  }
//                                      if (nachricht.equals("DONE_DATA"))
//                                      {
//                                          fileTransfer = false;
//                                          System.out.println(uName+": SOCKET OPEN FOR STRINGS!");
//                                      }

                                  else if (!fileTransfer)
                                  {
                                      ssc.input(nachricht);
                                      String out =  uName+": Empfangenes Signal: "+nachricht;
                                      System.out.println(out);    
                                  }

                                  fileTransfer=false;

                                 }





                            System.out.println("Verbindungsabbruch durch verlassen des LOOPs: "+uName);
                            closeAllConnections();
                            startClientTimeOut();

                        }
                    catch (IOException e) 
                    {
                            closeAllConnections();
                            startClientTimeOut();
                            System.out.println("Verbindung tot mit Client: "+uName);

                       // e.printStackTrace();
                    }
            }

            public byte[] getDataStream(int bytes)
            {
                try {
                    InputStream in = client.getInputStream();
                //    BufferedInputStream bin = new BufferedInputStream(in);

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    byte buffer[] = new byte[1024];


                    while(baos.size()<bytes)
                    {
                        int s;
                     if ((s=in.read(buffer))>0)
                     {
                     baos.write(buffer, 0, s);
                     if(baos.size()>=bytes)
                     {
                         break;
                     }
                     }

                     System.out.println(uName+": recieved bytes: "+baos.size());

                    }

                    byte result[] = baos.toByteArray(); 


                    return result;

                } 
                catch (IOException ex) 
                {
                    ex.printStackTrace();
                    return null;
                }

            }

当禁用Client Thread.sleep时,Server Console如下所示:

... Sebi:收到的字节数:71456 Sebi:收到的字节数:72480 Sebi:收到的字节数:73504 Sebi:收到的字节数:74336 Sebi:收到的字节数:75360 Sebi:收到的字节数:75776 Sebi:收到的字节数:76800 Sebi:收到的字节数:77824 Sebi:收到的字节数:78656 Sebi:收到的字节数:79680 Sebi:收到的字节数:80096 Sebi:收到的字节数:81120 Sebi:收到的字节数:81536 Sebi:收到的字节数:82560 Sebi:收到的字节数:83584 Sebi:收到的字节数:84608 Sebi:收到的字节数:85632 Sebi:收到的字节数:86032 Sebi:收到的字节数:86048 Sebi:收到的字节数:86064 Sebi:收到的字节数:86080 Sebi:收到的字节数:86096 Sebi:收到的字节:86112 Sebi:收到的字节数:86128 Sebi:收到的字节数:86149 Sebi:收到的字节数:86165 Sebi:收到的字节数:86181 Sebi:收到的字节数:86197 Sebi:收到的字节数:86213 Sebi:收到的字节数:86229 Sebi:收到的字节数:86251 Sebi:收到的字节数:86267 Sebi:收到的字节数:86283 Sebi:收到的字节数:86299 Sebi:收到的字节:86315 Sebi:收到的字节数:86331 Sebi:收到的字节数:86353 Sebi:收到的字节数:86369 Sebi:收到的字节:86385 Sebi:收到的字节数:86401 Sebi:收到的字节:86417

字节数组(长度)正好是102400!我以前很难过......睡觉时一切都很好!

我希望有人可以帮助我! 谢谢=)

0 个答案:

没有答案