Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以大约40%的永久块率解决Android客户端Java服务器代码?_Java_Sockets - Fatal编程技术网

如何以大约40%的永久块率解决Android客户端Java服务器代码?

如何以大约40%的永久块率解决Android客户端Java服务器代码?,java,sockets,Java,Sockets,[编辑以解释此发布的问题不是重复引用的问题:: 引用问题中代码的结构、细节和例程与我的非常不同他正在发送多个文件并在core中使用arraylist。虽然我的代码一次发送一个文件,但我从未在core中使用arraylist。因此,导致我偶尔阻塞的原因可能不会与他/她自己的代码的问题重叠 在第一个答案中,EJP说:“您正在读取套接字,直到read()返回-1。”我在代码中没有这样做 在第一个答案中,EJP说“您需要在每个文件之前发送文件大小。您已经在对文件计数进行类似的操作。然后确保您读取了该文件

[编辑以解释此发布的问题不是重复引用的问题::

  • 引用问题中代码的结构、细节和例程与我的非常不同他正在发送多个文件并在core中使用arraylist。虽然我的代码一次发送一个文件,但我从未在core中使用arraylist。因此,导致我偶尔阻塞的原因可能不会与他/她自己的代码的问题重叠

  • 在第一个答案中,EJP说:“您正在读取套接字,直到read()返回-1。”我在代码中没有这样做

  • 在第一个答案中,EJP说“您需要在每个文件之前发送文件大小。您已经在对文件计数进行类似的操作。然后确保您读取了该文件的确切字节数:”我已经在我原始发布代码中发送的文件之前发送了确切的文件大小,因此这不是我的代码的问题,也不是我面临的问题的解决方案

  • 第二个答案中的代码(在引用的副本中)具有不同的用途,因此我无法从中推断出解决方案到我自己的代码

  • 引用的问题是“后续文件在服务器文件夹中创建,但它们是0字节”这不是我自己的代码的问题。当我的代码运行时,我在客户端和服务器端都会收到完整的文件字节

  • 总的来说,我已经通读了引用的问题和提供的解决方案,但它们并没有为我面临的问题提供任何解决方案

  • [谢谢你]

    我对客户机-服务器编码比较陌生。 我有Android作为客户端和Java服务器。目前的系统是这样工作的: Android客户端从SD卡中选择/加载一幅Jpeg图像,将整数大小、字符串文本和图像文件发送到服务器,服务器将整数和包含数据的文本文件发送回客户端

    目前我的问题运行良好(随机),只有大约60%的运行。剩余的时间会永久阻塞,我必须重新启动服务器才能继续。[当然,有一半多一点的时间,客户机-服务器系统发送和接收时不会出现故障,但约40%到45%(永久块)的故障率是不可接受的]

    当它阻塞时,没有崩溃转储、堆栈跟踪或读取错误。 我搜索了以前类似的阻塞问题,并尝试以不同的顺序关闭套接字、inputstream/outputstream和包装器,改变排列,但成功/永久阻塞率保持不变

    因为没有堆栈跟踪和随机性,我不知道是什么导致了阻塞。除了使用print语句之外,所有服务器和客户端代码的最后一次永久挂起的打印都在服务器代码中接收do while循环的字节中

    我不知道该怎么解决这个问题。我希望在这个领域有经验的人能帮助解决这个问题。完整代码如下

    Java服务器代码

    public class FileServer {                 
    
      public static  void main(String[] args) throws IOException {
          int bytesRead;     
          int current = 0;   
         //===============================================
          FileInputStream fis = null;
          BufferedInputStream bis = null;
          OutputStream os = null;           
          ServerSocket servsock = null;
          Socket sock = null;                 
          //==============================================
          InetAddress IP=InetAddress.getLocalHost();   
          servsock = new ServerSocket(57925);      
          System.out.println("IP "+IP.getHostAddress()+"  ***%% :"+servsock.getLocalPort());  
    
          while (true) {      
            sock = servsock.accept();
            System.out.println("Accepted connection : " + sock);
    
              InputStream is = sock.getInputStream();
     //=========================================================
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
     //=================== read integer from client ============
              String number = br.readLine();
              System.out.println("integer received from client is "+String.valueOf(number));
               byte [] mybytearray  = new byte [Integer.valueOf(number)];
     //=================== read filename string =====================================  
               String filename = br.readLine();
               System.out.println("integer received from client is "+filename);
    
    //===================== read file data stream bytes ================================
             bytesRead = is.read(mybytearray,0,mybytearray.length);
             current = bytesRead;
             System.out.println("1  bytesRead  "+bytesRead+"  mybytearray.length  "+mybytearray.length);
    
             do {
                 bytesRead =  is.read(mybytearray, current, (mybytearray.length-current));
                 if(bytesRead >= 0) current += bytesRead;
                 System.out.println("2  current  "+current+"  bytesRead  "+bytesRead);
            } while(current < Integer.valueOf(number));         
    
    
            //============================== initialise filename ======================             
              FileOutputStream fos = new FileOutputStream("C:\\Server root folder\\"+filename+".jpg"); 
              BufferedOutputStream bos = new BufferedOutputStream(fos);
             //========================== write bytes to server HDD =======================       
              bos.write(mybytearray, 0 , current);
              System.out.println("4  current  "+current);
    
              bos.flush();
              long end = System.currentTimeMillis();   
    //          System.out.println("AT SERVER: bytesRead  "+bytesRead+"  current  "+current);
    //          bos.close();  
    // ======================== write to-be-rendered data to text file ====================== 
    
              File pathPlusfile = new File("C:/Server root folder/"+filename+".txt");
    
              appendToFile( pathPlusfile, "file name::  "+filename+"*   *", 20999  );
    
    
    /**/  //==================   Send Data in text file to Client  ============================================              
              // send file     
              mybytearray  = new byte [(int)pathPlusfile.length()];
              fis = new FileInputStream(pathPlusfile);
              bis = new BufferedInputStream(fis);
              bis.read(mybytearray,0,mybytearray.length);
     //===============================================   
              os = sock.getOutputStream();
    //=========================== send integer to client ===============                   
              OutputStreamWriter osw = new OutputStreamWriter(os);
              BufferedWriter bw = new BufferedWriter(osw);
              number = Integer.toString(mybytearray.length);
              String sendMessage = number + "\n";
              bw.write(sendMessage);
              bw.flush();   
    //========================== send file to client ===================                
              System.out.println("Sending " + filename + "(" + mybytearray.length + " bytes)");
              os.write(mybytearray,0,mybytearray.length);
              os.flush();
        //========================= close =================================      
              System.out.println("number  "+number);
              System.out.println("Done.");
    
              bos.close();
              bw.close();
              osw.close();
              os.close();
     //         fos.close();
     //         bis.close();
    //          fis.close();
     //         br.close();
              isr.close();
              is.close();
    
              closeFile(  );               
    //           servsock.close();
    //           sock.close(); 
         }
      }
    
      BufferedReader bufferedReader = null;
      String stringObjectData = "";
      public int  numFromFile = 0;
    
    
         static BufferedWriter  bufferedWriter = null;
        public static  void appendToFile( File myPathPlusFile, String S, int num  ){
    
           try{
              bufferedWriter = new BufferedWriter(new FileWriter(myPathPlusFile, true));
              bufferedWriter.append( S ); 
              bufferedWriter.append( "     " ); 
              bufferedWriter.append( Integer.toString(num) ); 
              bufferedWriter.newLine();
              bufferedWriter.flush();
           }
           catch (IOException e){
              e.printStackTrace();
           }
         }
    
         public static  void closeFile(  ){
           try{
              bufferedWriter.close();
           }
           catch (IOException e)
           {
              e.printStackTrace();
           }
        }
    }
    
    公共类文件服务器{
    公共静态void main(字符串[]args)引发IOException{
    int字节读取;
    int电流=0;
    //===============================================
    FileInputStream fis=null;
    BufferedInputStream bis=null;
    OutputStream os=null;
    ServerSocket servsock=null;
    套接字sock=null;
    //==============================================
    InetAddress IP=InetAddress.getLocalHost();
    servsock=新服务器套接字(57925);
    System.out.println(“IP”+IP.getHostAddress()+“***%%”:“+servsock.getLocalPort());
    虽然(正确){
    sock=servsock.accept();
    System.out.println(“接受的连接:+sock”);
    InputStream=sock.getInputStream();
    //=========================================================
    InputStreamReader isr=新的InputStreamReader(is);
    BufferedReader br=新的BufferedReader(isr);
    //======================从客户端读取整数============
    字符串编号=br.readLine();
    System.out.println(“从客户端接收的整数为”+String.valueOf(number));
    byte[]mybytearray=新字节[Integer.valueOf(number)];
    //=====================================================================================================================================================================
    字符串文件名=br.readLine();
    System.out.println(“从客户端接收的整数是”+文件名);
    //=========================读取文件数据流字节================================
    bytesRead=is.read(mybytearray,0,mybytearray.length);
    当前=字节读取;
    System.out.println(“1字节读取”+bytesRead+“mybytearray.length”+mybytearray.length);
    做{
    bytesRead=is.read(mybytearray,current,(mybytearray.length current));
    如果(字节读>=0)当前+=字节读;
    系统输出打印项次(“2电流”+电流+“字节读取”+字节读取);
    }而(当前<整数.valueOf(number));
    //==========================================初始化文件名=====================================
    FileOutputStream fos=新的FileOutputStream(“C:\\Server根文件夹\\“+filename+”.jpg”);
    BufferedOutputStream bos=新的BufferedOutputStream(fos);
    //================================================将字节写入服务器HDD===============================================================
    写入(mybytearray,0,当前);
    系统输出打印项次(“4电流”+电流);
    bos.flush();
    long end=System.currentTimeMillis();
    //System.out.println(“在服务器上:字节读”+字节读+“当前”+当前”);
    //bos.close();
    //=============================================将要呈现的数据写入文本文件===============================
    文件路径plusfile=新文件(“C:/Server root
    
    public class FSendfileActivity extends Activity {
        private static final int SELECT_PICTURE = 1;
        private Socket sock;
        private String serverIP = "192.168.1.4";    
        private String selectedImagePath;
        private ImageView img;
        final static String qcd = "qcd";
        String ImageDir2Client;      
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        Button send;
    //====================
        public  static String   FILE_TO_RECEIVED=null;
        String cFilename = null;
        int bytesRead = -1;
        int current = 0;                 
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fsendfile);    
    
            ImageDir2Client = Environment.getExternalStorageDirectory().getAbsolutePath();                    
            cFilename = "fromServer000019ggg";
            FILE_TO_RECEIVED = ImageDir2Client + "/client root/"+cFilename+".txt";  
    
    
            img  = (ImageView) findViewById(R.id.ivPic);  
    
           ((Button) findViewById(R.id.bBrowse)).setOnClickListener(new OnClickListener() {
               public void onClick(View arg0) {
    
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult( Intent.createChooser( intent, "Select Picture" ), SELECT_PICTURE );
                }
           });
    
           send = (Button) findViewById(R.id.bSend);
    
           send.setOnClickListener(new View.OnClickListener() {
               @Override                     
               public void onClick(View arg0) {
                new Thread(new Runnable() {                  
                       @Override        
                       public void run() {            
                           try {                                     
                            sock = new Socket();     
                            connection(sock,  serverIP, 57925);
    
                //=================== prepare buffer to read file ====================
                                File myFile = new File (selectedImagePath); 
                                byte [] mybytearray  = new byte [(int)myFile.length()];
                                FileInputStream fis = new FileInputStream(myFile);
                                BufferedInputStream bis = new BufferedInputStream(fis);
                           //=============== read file from sdcard to buffer ==========     
                                bis.read(mybytearray,0,mybytearray.length);
                //=================================================================                   
                                OutputStream os = sock.getOutputStream();
                                OutputStreamWriter osw = new OutputStreamWriter(os);
                                BufferedWriter bw = new BufferedWriter(osw);
                //============================= send size integer ===================                
                                String number = Integer.toString(mybytearray.length);
                                String sendMessage = number + "\n";
                                bw.write(sendMessage);   // send size integer here
                //============================= send file name =====================
                                String sendMessage2 = cFilename + "\n";
                                bw.write(sendMessage2);   // send size filename here
                                osw.flush();
                                bw.flush();
                //==================================================================                
                                os.write(mybytearray,0,mybytearray.length); // send file
                                os.flush();  
    
        //=================  client receiving data ==============================
                            InputStream is = sock.getInputStream();
            //=================== read integer from client ==========
                            InputStreamReader isr = new InputStreamReader(is);
                            BufferedReader br = new BufferedReader(isr);
                            number = br.readLine();
           //========================= set incoming file size=============================
                            mybytearray  = new byte [Integer.valueOf(number)];
            //========================read file bytes in chunks===============================         
                            bytesRead = is.read(mybytearray,0,mybytearray.length);
                            current = bytesRead;
                            do {
                               bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
                               if(bytesRead >= 0) current += bytesRead;
                            } while(current < Integer.valueOf(number));
    
                            fos = new FileOutputStream(FILE_TO_RECEIVED);
                            bos = new BufferedOutputStream(fos);
                            bos.write(mybytearray, 0 , current);
                            bos.flush();                                
                            try{        
                                bos.close(); 
                                osw.close();
                                os.close();
                  //            fos.close();
                  //            bw.close();
                  //            br.close();
                  //            isr.close();
                                bis.close();
                                sock.close();
                  //            fis.close();
                            }        
                            catch(Exception e){
                                e.printStackTrace();
                            }
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();  
                        }  finally{
                            try{     
                            }
                            catch(Exception e){
                                e.printStackTrace();
                            }
                        } 
                    }
                  }).start();
                }
            });
    
        }       
    
        public static void connection(Socket s,  String serverIP, int port) {
            try {   
                Log.v(qcd, " before connecting ****...");
                s.connect(new InetSocketAddress(serverIP, port), 120000);
                Log.v(qcd, " socket connection DONE!! ");
            } catch (UnknownHostException e) {
                e.printStackTrace();
                Log.v(qcd, " Unknown host..."+e);
            } catch (IOException e) {
                e.printStackTrace();
                Log.v(qcd, " Failed to connect...   "+e);
            }
        }
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK) {
                if (requestCode == SELECT_PICTURE) {
                    img.setImageURI(null);
                    Uri selectedImageUri = data.getData();
                    selectedImagePath = getPath(selectedImageUri);
                    TextView path = (TextView) findViewById(R.id.tvPath);
                    path.setText("Image Path : " + selectedImagePath);
                    img.setImageURI(selectedImageUri);
                }     
            }
        }
    
        public String getPath(Uri uri) {
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } 
    }
    
    import java.io.*;
    import java.net.*;
    import java.util.concurrent.atomic.AtomicInteger;
    public class So43462480 {
        public interface Consumer<T> { // instead of 1.8 definition
            void accept(T t);
        }
        class Server extends Thread {
            Server(ServerSocket serverSocket,Consumer<Socket> consumer) {
                super("Server");
                this.serverSocket=serverSocket;
                this.consumer=consumer;
            }
            @Override public void run() {
                System.out.println("server running on: "+serverSocket);
                while(true)
                    try {
                        Socket socket=serverSocket.accept();
                        if(consumer!=null)
                            consumer.accept(socket);
                    } catch(IOException e) {
                        System.out.println(getName()+" caught: "+e);
                        break;
                    }
            }
            final ServerSocket serverSocket;
            final Consumer<Socket> consumer;
        }
        void read(Socket socket) {
            InputStream inputStream=null;
            try {
                inputStream=socket.getInputStream();
                BufferedReader in=new BufferedReader(new InputStreamReader(inputStream));
                String string=in.readLine();
                System.out.println(string+" from: "+socket);
                socket.close();
                System.out.println(Thread.currentThread().getName()+" succeeded");
            } catch(IOException e) {
                System.out.println(Thread.currentThread().getName()+" caught: "+e);
            }
        }
        So43462480(String host,Integer service) throws IOException {
            ServerSocket serverSocket=new ServerSocket();
            SocketAddress socketAddress=new InetSocketAddress(host,service);
            serverSocket.bind(socketAddress);
            Consumer<Socket> socketConsumer=new Consumer<Socket>() {
                @Override public void accept(Socket socket) {
                    final int n=accepts.incrementAndGet();
                    System.out.println("accepted #"+n+" from: "+socket);
                    new Thread(new Runnable() {
                        @Override public void run() {
                            read(socket);
                        }
                    },"accept #"+n).start();
                }
            };
            new Server(serverSocket,socketConsumer).start();
        }
        static boolean send(String host,Integer service) {
            Socket socket;
            try {
                socket=new Socket(host,service);
                OutputStreamWriter out=new OutputStreamWriter(socket.getOutputStream());
                out.write("hello\n");
                out.flush();
                socket.close();
                return true;
            } catch(IOException e) {
                e.printStackTrace();
            }
            return false;
        }
        public static void main(String[] args) throws InterruptedException {
            final String host="localhost";
            final Integer service=1237;
            try {
                So43462480 tcp=new So43462480(host,service);
            } catch(Exception e) {
                System.out.println("main caught: "+e);
            }
            for(int i=0;i<10;i++) {
                boolean ok=send(host,service);
                if(!ok)
                    System.out.println("send failed");
            }
            Thread.sleep(100);
            for(Thread thread:Thread.getAllStackTraces().keySet())
                System.out.println(thread);
        }
        AtomicInteger accepts=new AtomicInteger();
    }
    
    import java.io.*;
    import java.net.*;
    import java.util.concurrent.atomic.AtomicInteger;
    public class So43462480take2 {
        class Server extends Thread {
            Server(ServerSocket serverSocket) {
                super("Server");
                this.serverSocket=serverSocket;
            }
            @Override public void run() {
                System.out.println("server running on: "+serverSocket);
                while(true)
                    try {
                        Socket socket=serverSocket.accept();
                        final int n=accepts.incrementAndGet();
                        System.out.println("accepted #"+n+" from: "+socket);
                        new Thread(new Runnable() {
                            @Override public void run() {
                                InputStream inputStream=null;
                                try {
                                    inputStream=socket.getInputStream();
                                    BufferedReader in=new BufferedReader(new InputStreamReader(inputStream));
                                    String string=in.readLine();
                                    System.out.println(string+" from: "+socket);
                                    socket.close();
                                    System.out.println(Thread.currentThread().getName()+" succeeded");
                                } catch(IOException e) {
                                    System.out.println(Thread.currentThread().getName()+" caught: "+e);
                                }
                            }
                        },"accept #"+n).start();
                    } catch(IOException e) {
                        System.out.println(getName()+" caught: "+e);
                        break;
                    }
            }
            final ServerSocket serverSocket;
        }
        So43462480take2(String host,Integer service) throws IOException {
            serverSocket=new ServerSocket();
            SocketAddress socketAddress=new InetSocketAddress(host,service);
            serverSocket.bind(socketAddress);
            new Server(serverSocket).start();
        }
        static boolean send(String host,Integer service) {
            Socket socket;
            try {
                socket=new Socket(host,service);
                OutputStreamWriter out=new OutputStreamWriter(socket.getOutputStream());
                out.write("hello\n");
                out.flush();
                socket.close();
                return true;
            } catch(IOException e) {
                e.printStackTrace();
            }
            return false;
        }
        public static void main(String[] args) throws InterruptedException, IOException {
            System.out.println("start");
            final String host="localhost";
            final Integer service=1237;
            So43462480take2 tcp=new So43462480take2(host,service);
            for(int i=0;i<10;i++) {
                boolean ok=send(host,service);
                if(!ok)
                    System.out.println("send failed");
            }
            Thread.sleep(1000);
            try {
            tcp.serverSocket.close();} catch(IOException e) {
                System.out.println("close caught: "+e);
            }
            Thread.sleep(1000);
            for(Thread thread:Thread.getAllStackTraces().keySet())
                System.out.println(thread);
        }
        final ServerSocket serverSocket;
        AtomicInteger accepts=new AtomicInteger();
    }