天天看点

用socket通信实现Android客户端与Java服务端互传图片

用Android做客户端,用Java做服务端,然后在客户端进行上传图片和下载图片的操作,服务端响应对应的操作。使用socket通信。
           

在同一台PC上运行:

Java服务端

接收图片

//接收图片
    public static void recImage(Socket socket){
        try {
            //获取输入流
            DataInputStream inputStream = new DataInputStream(socket.getInputStream());

            File file = new File("./src/images/");
            if (!file.exists()) {//判断文件是否存在
                file.mkdirs();
            }
            //写入文件
            //图片名
            String filename = "/" + System.currentTimeMillis() + ".jpg";
            FileOutputStream fileOutputStream = new FileOutputStream(file + filename);
            byte[] bytes = new byte[inputStream.available()];
            System.out.println("receive字节大小" + inputStream.available());

            inputStream.read(bytes);
            fileOutputStream.write(bytes);
            fileOutputStream.flush();

            inputStream.close();
            fileOutputStream.close();
            socket.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

           

发送图片

public static void sendImage(Socket socket){
        try {
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            FileInputStream fis = new FileInputStream("./src/images/2.jpg");
            
            System.out.println("图片大小" + fis.available());
            byte[] data = new byte[fis.available()];
            fis.read(data);
            dos.writeInt(fis.available());
            dos.write(data);
            dos.flush();
            
            dos.close();
            fis.close();
            socket.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

           

主函数

public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            Socket socket = serverSocket.accept();
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
            String s = "";
            s = dataInputStream.readUTF();
            if (s.equals("1")){
                recImage(socket);
            }
            else if (s.equals("2")){
                sendImage(socket);
            }
            else {
                System.out.println(""+s);
            }
        }
    }
           

Android客户端

发送图片

new Thread() {//上传
    @Override
            public void run() {
                try {
                      Socket socket = new Socket("IP地址", 8888);
                      if (!socket.isConnected()) {
                           System.out.println("连接失败");
                       }
                       System.out.println("连接成功");
                       DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());//获取输出流
                            //得到要发送的图片
					   outputStream.writeUTF("1");
                       outputStream.flush();
                       File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "dp.jpg");
                       //将图片文件注入输入流
                       FileInputStream fileInputStream = new FileInputStream(file);
                       System.out.println("send字节大小" + fileInputStream.available());
                            //得到文件的大小
                       byte[] data = new byte[fileInputStream.available()];
//                            int length = 0;
//                            while ((length = fileInputStream.read(data, 0, data.length))!=-1) {
//                                outputStream.write(data, 0, data.length);//输出
//                                outputStream.flush();
//                            }
                        fileInputStream.read(data);
                        outputStream.write(data);
                        outputStream.flush();

                        outputStream.close();
                        fileInputStream.close();
                       
                        socket.close();
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
           

接收图片

new Thread() {//上传
    @Override
    public void run() {
 		Socket socket = null;
        try {           
            socket = new Socket("IP地址", 8888);
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataOutputStream.writeUTF("2");
            dataOutputStream.flush();
            DataInputStream dataInput = new DataInputStream(socket.getInputStream());
            int size = dataInput.readInt();
            byte[] data = new byte[size];
            int len = 0;
            while (len < size) {
                  len += dataInput.read(data, len, size - len);
             }
             System.out.println(""+data);
              //ByteArrayOutputStream outPut = new ByteArrayOutputStream();
              //       Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
              //        bmp.compress(Bitmap.CompressFormat.PNG, 100, outPut);
              //       imageView.setImageBitmap(bmp);
               File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),System.currentTimeMillis()+"receive.jpg");
               FileOutputStream outputStream = new FileOutputStream(file);
               outputStream.write(data);
               outputStream.flush();
		} catch (IOException e) {
                e.printStackTrace();
        } finally {
          		try {
                       socket.close();
                 } catch (IOException e) {
                        e.printStackTrace();
                    }
                  }

         }
    }.start();
           

服务端部署到Linux服务器上

服务器

public class server1 {
//    public static void main(String[] args) throws IOException {
//        ServerSocket serverSocket = new ServerSocket(8888);
//        while (true){
//            Socket socket = serverSocket.accept();
//            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
//            String s = "";
//            s = dataInputStream.readUTF();
//            System.out.println(s);
//            if (s.equals("1")){
//                recImage(socket,System.currentTimeMillis()+".jpg");
//            }
//            else if (s.substring(0,1).equals("2")){
//                String filename = s.substring(1);
//                sendImage(socket, filename);
//            }
//            else {
//                System.out.println(""+s);
//            }
//        }
//    }
    public static int link(int name) throws IOException {
       ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
       int a=0;
        while (true){
       //     Socket socket = serverSocket.accept();
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
            String s = "";
            s = dataInputStream.readUTF();
            System.out.println(s);
            if (s.equals("1")){
             //   recImage(socket,System.currentTimeMillis()+".jpg");
                recImage(socket, String.valueOf(name));
            }
            else if (s.substring(0,1).equals("2")){
                String filename = s.substring(1);
                a = sendImage(socket, filename);
                System.out.println("返回值:"+a);
                return a;
            }
            else {
                System.out.println(""+s);
            }
        }
    }
    public static int sendImage(Socket socket,String filename){
        String filepath = "./src/images/";
        try {
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            File file = new File(filepath+"/"+filename+".jpg");
            if(!file.exists()){
                System.out.println("图片不存在");
              //  throw new FileNotFoundException();
                dos.writeUTF("fail");
            }
            dos.writeUTF("success");
            FileInputStream fis = new FileInputStream(file);
            int size = fis.available();

            System.out.println("size = " + size);
            byte[] data = new byte[size];
            fis.read(data);
            dos.writeInt(size);
            dos.write(data);
            dos.flush();

            dos.close();
            fis.close();
            socket.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Integer.parseInt(filename);
    }

    public static int recImage(Socket socket,String filename){
        String filepath = "./src/images/";
        try {
            //获取输入流
            DataInputStream inputStream = new DataInputStream(socket.getInputStream());

            int size = inputStream.readInt();

            System.out.println("size"+size);
            File file = new File("./src/images/");
            if (!file.exists()) {
                file.mkdirs();
            }
            //写入文件
         //   String filename = "/" + System.currentTimeMillis() + ".jpg";
            FileOutputStream fileOutputStream = new FileOutputStream(file +"/"+filename+".jpg");
         //   byte[] bytes = new byte[inputStream.available()];
            byte[] bytes = new byte[size];
            System.out.println("receive字节大小" + inputStream.available());

            //inputStream.available()适用于本地数据,
            int len = 0;
            while (len < size) {
                len += inputStream.read(bytes, len, size - len);
            }

        //   inputStream.read(bytes);
            fileOutputStream.write(bytes);
            fileOutputStream.flush();

            inputStream.close();
            fileOutputStream.close();
            socket.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("filename"+filename);
        return Integer.parseInt(filename);

    }

}
           

客户端

bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread() {//上传
                    @Override
                    public void run() {
                        try {
                            Socket socket = new Socket("IP地址", 8888);
                            if (!socket.isConnected()) {
                                System.out.println("连接失败");
                            }
                            System.out.println("连接成功");
                            DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());//获取输出流
                            //得到要发送的图片
                            outputStream.writeUTF("1");
                            outputStream.flush();

                            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "head.jpg");
                            //将图片文件注入输入流
                            FileInputStream fileInputStream = new FileInputStream(file);
                            System.out.println("send字节大小" + fileInputStream.available());
                            //得到文件的大小
                            int size = fileInputStream.available();
                            byte[] data = new byte[size];
//                            int length = 0;
//                            while ((length = fileInputStream.read(data, 0, data.length))!=-1) {
//                                outputStream.write(data, 0, data.length);//输出
//                                outputStream.flush();
//                            }
                            fileInputStream.read(data);

                            outputStream.writeInt(size);
                            outputStream.write(data);
                            outputStream.flush();
                            
                            outputStream.close();
                            fileInputStream.close();
                            // bout.close();
                            socket.close();
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
            }
        });
           
Socket socket = null;
                        try {               
                            socket = new Socket("ip地址", 8888);
                            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                            dataOutputStream.writeUTF("2"+et.getText().toString());
                            dataOutputStream.flush();
                            DataInputStream dataInput = new DataInputStream(socket.getInputStream());

                            String response = dataInput.readUTF();//获取服务端返回的信息
                            if(response.equals("success")) {//成功

                                File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),et.getText().toString()+".jpg");
                                FileOutputStream outputStream = new FileOutputStream(file);
                                System.out.println(response);
                                int size = dataInput.readInt();
                                byte[] data = new byte[size];
                                int len = 0;
                                while (len < size) {
                                    len += dataInput.read(data, len, size - len);
                                }
                                System.out.println("" + data);
                                //         ByteArrayOutputStream outPut = new ByteArrayOutputStream();
                                //       Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
                                //        bmp.compress(Bitmap.CompressFormat.PNG, 100, outPut);
                                //       imageView.setImageBitmap(bmp);

                                outputStream.write(data);
                                outputStream.flush();
                                outputStream.close();
                            }
                
                            else {
                                System.out.println("图片不存在");
                            }

                            dataInput.close();
                            dataOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
           

出现的问题

刚开始字节数组的大小我都用input stream.available(),在本地运行的时候都是可以的,但是用Linux服务器时发现老是接收不到数据,就算接收到了数据也是不完整的,后来发现是nputstream.available()这个方法的问题。

关于InputStream类的available()方法:

要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。

能否使用取决于实现了InputStream这个抽象类的具体子类中有没有实现available这个方法。如果实现了那么就可以取得大小,如果没有实现那么就获取不到。

int count = in.available();

byte[] b = new byte[count];

in.read(b);

在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。

需要改成这样:

int count = 0;

while (count == 0) {

count = in.available();

}

byte[] b = new byte[count];

in.read(b);

http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html