Java 使用BufferWriter和BufferReader通过TCP套接字发送图像
我从PC向Android应用发送一些文本,我还想通过同一个套接字发送图像数据。我尝试在Base64中对此进行编码,但最后piture已损坏。 我的代码看起来像这样 获取数据屏幕: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
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是不必要和浪费的。你完全正确。我忘记了解码字节[]数据。现在可以了。谢谢你的建议,我欠你一杯啤酒。:)