Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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
Java 使用BufferWriter和BufferReader通过TCP套接字发送图像_Java_Android_Sockets - Fatal编程技术网

Java 使用BufferWriter和BufferReader通过TCP套接字发送图像

Java 使用BufferWriter和BufferReader通过TCP套接字发送图像,java,android,sockets,Java,Android,Sockets,我从PC向Android应用发送一些文本,我还想通过同一个套接字发送图像数据。我尝试在Base64中对此进行编码,但最后piture已损坏。 我的代码看起来像这样 获取数据屏幕: public static byte[] getScreen() { BufferedImage imagebuf = null; try { imagebuf = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefa

我从PC向Android应用发送一些文本,我还想通过同一个套接字发送图像数据。我尝试在Base64中对此进行编码,但最后piture已损坏。 我的代码看起来像这样

获取数据屏幕:

public static byte[] getScreen()
{
    BufferedImage imagebuf = null;
    try {
        imagebuf = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    } catch (HeadlessException | AWTException e) {
        System.err.println("Can't get screen.");
        return null;
    }           

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] imageInByte;
    try {
        ImageIO.write(imagebuf, "jpg", baos);
        baos.flush();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    finally {       
        imageInByte = baos.toByteArray();
        try {
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return imageInByte; 
}
然后通过套接字发送数据:

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
List<ScreenBuffor> screenList = ScreenBuffor.getScreenList();//Place where I keep all screen data with names
            if(!screenList.isEmpty())
            {
                for(ScreenBuffor screen : screenList)
                {                       bufferedWriter.write(InformationCommunicate.screenData);
                    bufferedWriter.newLine();
                    bufferedWriter.flush();                     

                    bufferedWriter.write(screen.getNameScreen());
                    bufferedWriter.newLine();
                    bufferedWriter.flush();

                    String image = Base64.getEncoder().encodeToString(screen.getDataScreen());

                    char[] imageCharacter = image.toCharArray();
                    int sizeArray = imageCharacter.length;

                    bufferedWriter.write(String.valueOf(sizeArray));
                    bufferedWriter.newLine();
                    bufferedWriter.flush();                     

                    bufferedWriter.write(imageCharacter, 0, sizeArray);
                    bufferedWriter.flush();                             
                }
            }
BufferedWriter BufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),“UTF-8”);
List screenList=screenbufor.getScreenList()//保存所有带有名称的屏幕数据的位置
如果(!screenList.isEmpty())
{
用于(屏幕浏览器或屏幕:屏幕列表)
{bufferedWriter.write(InformationCommunicate.screenData);
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.write(screen.getNameScreen());
bufferedWriter.newLine();
bufferedWriter.flush();
字符串image=Base64.getEncoder().encodeToString(screen.getDataScreen());
char[]imageCharacter=image.tocharray();
int sizerray=imageCharacter.length;
bufferedWriter.write(String.valueOf(sizeArray));
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.write(imageCharacter,0,sizeArray);
bufferedWriter.flush();
}
}
并在Android上读取和保存此图像数据:

InputStream input = clientSocket.getInputStream();
        InputStreamReader isr = new InputStreamReader(input, "UTF-8");
        BufferedReader reader = new BufferedReader(isr);

String lineCharacter = reader.readLine();

if(lineCharacter.equals(InformationCommunicate.screenData))
            {
                lineCharacter = reader.readLine();
                Log.i("PictureSave", "Image name: " + lineCharacter);
                nameScreen = new String(lineCharacter);
                lineCharacter = reader.readLine();
                Log.i("PictureSave", "Buffor Size: " + lineCharacter);
                int lengthBuf = Integer.parseInt(lineCharacter);
                char[] screenCharBuff = new char[lengthBuf];
                for(int i = 0; i < lengthBuf; i++)
                {
                    int onecharacter = reader.read();
                    if((int) onecharacter == -1)
                        throw new IllegalStateException("Image data is Incomplete");
                    screenCharBuff[i] = (char) onecharacter;
                }

                String imageString = new String (screenCharBuff);
                byte[] imageData = imageString.getBytes();

                File photo=new File(Environment.getExternalStorageDirectory(), "Picture" + lengthBuf + ".jpg");


                try {
                    FileOutputStream fos=new FileOutputStream(photo.getPath());

                    fos.write(imageData);
                    fos.close();
                }
                catch (java.io.IOException e) {
                    Log.e("PictureSave", "Exception in photoCallback", e);
                }
InputStream input=clientSocket.getInputStream();
InputStreamReader isr=新的InputStreamReader(输入,“UTF-8”);
BufferedReader读取器=新的BufferedReader(isr);
String lineCharacter=reader.readLine();
if(lineCharacter.equals(InformationCommunicate.screenData))
{
lineCharacter=reader.readLine();
Log.i(“PictureSave”,“图像名称:“+lineCharacter”);
名称屏幕=新字符串(行字符);
lineCharacter=reader.readLine();
Log.i(“PictureSave”,“buffer Size:+lineCharacter”);
int lengthBuf=Integer.parseInt(lineCharacter);
char[]屏幕charbuff=新字符[lengthBuf];
对于(int i=0;i

图像已保存,但如我所写,已损坏,无法打开。请帮助。

您没有从base64对其进行反编码,因此正在保存base64(picturedata),而不是图片数据。你有两个选择-首先解码,或者根本不编码。实际上,我会选择第二个选择-使用Base64的唯一原因是通过纯文本输入流发送二进制数据。因为这里没有纯文本输入流,所以使用Base64是不必要和浪费的。

你完全正确。我忘记了解码字节[]数据。现在可以了。谢谢你的建议,我欠你一杯啤酒。:)