سؤال

وأنا أحاول أن دفق الفيديو إلى خادم من جهاز آخر باستخدام جافا وبالنسبة للمبتدئين، وأنا مجرد محاولة لنقل ملف باستخدام اتصال مأخذ الخام وتيار بايت. ومع ذلك، فإن الأمور لا تظهر بنفس الطريقة. إذا كنت نقل ملف بهذه الطريقة، ملف 3MB على الجهاز الخاص بي ينتهي به الأمر 5MB على الخادم. أحاول هذا مع ملف الفيديو وملف الناتجة فعلا "يلعب" عندما كنت تحميل البرنامج وهو طول الصحيح ولكن ليس هناك صورة. المدونة أدناه:

والعميل (غاسل):

public static void main(String[] args){
    Socket sock = null;

    try{
        System.out.println("Connecting...");
        sock = new Socket("server.com", 8080);
        InputStream is = new FileInputStream(new File("Bear.wmv"));
        byte[] bytes = new byte[1024];

        OutputStream stream = sock.getOutputStream();

        int count = is.read(bytes, 0, 1024);
        while (count != -1){
            stream.write(bytes, 0, 1024);
            count = is.read(bytes, 0, 1024);
        }

        is.close();
        stream.close();
        sock.close();

    }catch (Exception e){
        e.printStackTrace();
    }
}

أجهزة الخادم (المتلقي):

public static void main(String[] args){
    ServerSocket sock = null;
    try {
        sock = new ServerSocket(8080);
    } catch (IOException e) {
        System.out.println("Could not instantiate socket:");
        e.printStackTrace();
        return;
    }

    Socket clientSock = null;
    while(true){

        try{

            System.out.println("Waiting for connection...");
            clientSock = sock.accept();
            final Socket fin = clientSock;
            System.out.println("Connection accepted");
            System.out.println("Spawning thread...");
            Thread trd = new Thread(new Runnable(){
                public void run(){
                    try {
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        System.out.println("Receiving video...");
                        File video = new File("test.wmv");
                        FileOutputStream fos = new FileOutputStream(video);
                        byte[] data = new byte[1024];
                        int count = fin.getInputStream().read(data, 0, 1024);
                        while (count != -1){
                            fos.write(data, 0, 1024);
                            count = fin.getInputStream().read(data, 0, 1024);
                        }
                        fos.close();
                        fin.close();
                        System.out.println("Done receiving");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }}
            });
            trd.start();

        }catch(IOException e){
            System.out.println("Could not accept");
            e.printStackTrace();
        }


    }



}

وأي أفكار؟ ويرجع الفضل في ذلك مسبقا!

وكريس

هل كانت مفيدة؟

المحلول

وهكذا أحسب أن أصل المشكلة.

ولقد غيرت الخادم فقط إرسال "العد" بايت

while (count != -1){
       fos.write(data, 0, count);
       count = fin.getInputStream().read(data, 0, 1024);
}

والآن يعمل:)

وشكرا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top