0 svar
154 visningar
Mimamed 13 – Fd. Medlem
Postad: 8 sep 2019 17:35 Redigerad: 8 sep 2019 17:37

Hur sänder man över och tar emot bilder mellan "Socket" och "ServerSockets"?

Helo!

Jag undrar hur man sänder bilder från socket till ServerSocket utan att behöva stänga ner någon av dem.

 

Jag har lyckats sända bilder med hjälp av koden nedan men när jag försökt sända bilder över ungefär 22 mb så funkar det inte, jag vet inte helt säkert varför men jag tror det har att göra med de så kallade "buffer" som ska rymma "bytes" som bilderna består av, eftersom jag får samma felmedelande om jag scalar ner "buffern" så din inte kan rymma bilden.

 

Vad jag har försökt är att självklart scala upp "buffern" vilket inte gjorde någon skillnad.

Jag har även testat använda dessa "ByteArrayOutputStream" och "ByteArrayInputStream" på det "rätta sättet" där jag typ får fram "Bufferns" storlek och sänder den först så jag tar emot exakt så mycket "Bytes" jag behöver från "andra sidan" om ni förstår vad jag menar. På detta sättet borde inte "buffrens" storlek/scala spela roll eftersom "buffren" alltid får den rätta storleken/scala då. Trotts detta så slutar det alltid med samma fel medelande oavset vilken lösning jag prövar.

 

Koden för servern

package lärning5;

import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Server
{

static ServerSocket servern;
static Socket client = new soketen();
static OutputStream ut;
static InputStream in;
static JFrame fön = new JFrame();
static Panelen pan = new Panelen();
static BufferedImage bild;
static File fil = new File("src\bilde\bilden.jpg");
static Scanner läs = new Scanner(System.in);

public static void main(String args[])
{
try
{
servern = new ServerSocket(7777, 9999);
client = servern.accept();
System.out.print("conectad");


ut = client.getOutputStream();
ut.flush();
in = client.getInputStream();

byte[] buffer = new byte[899999];

//in.read(buffer);

//ImageOutputStream bil = ImageIO.createImageOutputStream(bild);
in.read(buffer, 0, buffer.length);
ByteArrayInputStream bil = new ByteArrayInputStream(buffer, 0, buffer.length);
bild = ImageIO.read(bil);

} catch (Exception e)
{
System.out.print("gg wp ");
e.printStackTrace();
}

if (läs.nextLine().equals("s"))
{

fön.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
fön.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fön.add(pan);
fön.repaint();
fön.setVisible(true);
}
}
}

 

 

Koden för klienten

package lärning6;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

public class Client
{

static Socket servern;
static OutputStream sända;
static InputStream taEmot;
static Robot datorn;
static BufferedImage bild;
static ImageInputStream bil;
static File fil = new File("src\bilder\ddeee.PNG");


public static void main(String args[])
{


try
{

servern = new Socket(InetAddress.getByName("Ip addressen som du inte får se"), 7777);
sända = servern.getOutputStream();
sända.flush();
taEmot = servern.getInputStream();

//byte[] buffer = new byte[90000];

ByteArrayOutputStream bil = new ByteArrayOutputStream();
bild = ImageIO.read(fil);//datorn.createScreenCapture(new Rectangle(0, 0, 500, 500));

ImageIO.write(bild, "PNG", bil);


sända.write(bil.toByteArray());
/*
bil = ImageIO.createImageInputStream(bild);
//bil.read(buffer, 0, buffer.length);
ImageOutputStream bil = null;

ImageIO.write(bild, "png", bil);
buffer = bil.*/

}catch(Exception e)
{
System.out.print("gg wr");
e.printStackTrace();
}

}

}

 

Koden för Panel classen hos servern

package lärning5;

import java.awt.Graphics;

import javax.swing.JPanel;

public class Panelen extends JPanel
{

public void paintComponent(Graphics g)
{

g.drawImage(Server.bild, 0, 0, this.getWidth(), this.getHeight(), null);
}
}

 

Fel medelanden(den poppar upp hos servern)

conectadgg wp javax.imageio.IIOException: Error reading PNG image data
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.readImage(Unknown Source)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.read(Unknown Source)
at java.desktop/javax.imageio.ImageIO.read(Unknown Source)
at java.desktop/javax.imageio.ImageIO.read(Unknown Source)
at lärning5.Server.main(Server.java:55)
Caused by: java.io.EOFException: Unexpected end of ZLIB input stream
at java.base/java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.base/java.util.zip.InflaterInputStream.read(Unknown Source)
at java.base/java.io.BufferedInputStream.fill(Unknown Source)
at java.base/java.io.BufferedInputStream.read1(Unknown Source)
at java.base/java.io.BufferedInputStream.read(Unknown Source)
at java.base/java.io.DataInputStream.readFully(Unknown Source)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodePass(Unknown Source)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodeImage(Unknown Source)
... 5 more

 

Vad som händer när man kör koden är att clienten gör sitt jobb utan problem och skickar över bildens "Byte arrays", Men när servern tar emot den så kan den inte convertera "Byte arrayen" tillbaka till en bild("BufferedImage") och då popar fel medelandet upp. Servern körs fortförande och jag kan fortförande trycka "s" så att ett blank fönster poppar up

 

Vad Jag vill ska hända och händer om jag använder mindre bilder är att clienten skickar över bildens "Bytes" utan problem och servern converterar "Byte arrayen" correct tillbaka till en bild och väntar tills jag trycker "s". Om jag trycker "s" så ska ett fönster poppa upp med bilden jag skickade

 

Jag ber om ursäkt för ett lite slarvigt programering, försök att ignorera kommentarerna

Svara
Close