IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Server a Client

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
mara
Člen
Avatar
mara:16.12.2014 17:50

Ahojte mám problém. Nevím jakto, ale nefunguje mi server a client. Zdrojový kód od servru vypadá takto :

package javaapplication8;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class JavaApplication8 {
    public static int socfileketPort = 4444;
    public static String fileToGet = "/home/marek/Plocha/soubor_1_byl_prijat.txt";
    public static int file_size = 60000;

    public static void main(String[] args) throws IOException {
            int bytesRead;
            int current = 0;
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            ServerSocket servsock = null;
            Socket sock = null;
        try{
            servsock = new ServerSocket(4444);
            System.out.println("waiting .....");
            while (true){
                System.out.println("13");
                    sock = servsock.accept();
                    System.out.println("pripojeno");
                    byte[] mybytearray = new byte[file_size];
                    InputStream is = sock.getInputStream();
                    fos = new FileOutputStream(fileToGet);
                    bos = new BufferedOutputStream(fos);
                    bytesRead = is.read(mybytearray, 0, mybytearray.length);
                    current = bytesRead;
                    do{
                        bytesRead = is.read(mybytearray, current, (mybytearray.length - current));
                        if(bytesRead >= 0) current += bytesRead;

                    }while(bytesRead > -1);
                    bos.write(mybytearray, 0, current);
                    bos.flush();
            }


        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(fos != null) fos.close();
            if(bos != null) bos.close();
            if(sock != null) sock.close();

        }
    }
}

a od clienta takto :

package com.example.marek.comunication;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Send extends Activity {
    String s;
    String FileToSend;
    FileInputStream fis;
    BufferedInputStream bis;
    OutputStream os;
    Socket sock;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        Intent it = getIntent();
        final Uri uri = it.getParcelableExtra(Intent.EXTRA_STREAM);
        s = uri.toString();
        FileToSend = s;
        Button button = (Button)findViewById(R.id.reconnect_button);
        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Thread start = new Thread(new Runnable() {
                    @Override
                    public void run() {

                        try{
                            sock = new Socket("192.168.1.13", 4444);
                            while(true){
                                File myFile = new File(FileToSend);
                                byte[] mybytearray = new byte[(int)myFile.length()];
                                fis = new FileInputStream(myFile);
                                bis = new BufferedInputStream(fis);
                                bis.read(mybytearray, 0, mybytearray.length);
                                os = sock.getOutputStream();
                                os.write(mybytearray, 0, mybytearray.length);
                                os.flush();


                            }

                        }catch(Exception e){
                            e.printStackTrace();
                        }finally{
                             try {
                                 if(bis != null) bis.close();
                                 if (fis != null) fis.close();
                                 if (sock != null) sock.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                        }


                    }
                });
                start.start();
            }
        });

    }
}

všem moc děkuji za odpověď :) Už nevím, co dělám blbě .. :(

Odpovědět
16.12.2014 17:50
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:17.12.2014 13:42

Prosím nevíte někdo ?? zatím jsem na to, co dělám blbě nepřišel :(

Nahoru Odpovědět
17.12.2014 13:42
Co na srdci, to na Facebooku
Avatar
coells
Tvůrce
Avatar
Odpovídá na mara
coells:17.12.2014 19:15

Tušil jsem, že jsi založil tohle vlákno http://www.itnetwork.cz/…490a85b4437a#… protože ti nikdo neodpovídal. Ale složitost úlohy je relativní. V tomhle případě mi trvalo asi minutu najít v tvém kódu takovou spoustu chyb, že nemělo smysl na to odpovídat :-)

Ale když už jsme u toho, začni od začátku. Udělej si jednoduchou konzolovou aplikaci a pošli si pouze jednou 1 znak. Až ti to bude fungovat, zkoušej si posílat soubory a složitější věci. Pak teprve přejdi na android a stejný kód zkoušej na něm.

A také si o tom něco načti, dělat něco bez zkušeností a navíc ještě bez znalostí je velice složité.

 
Nahoru Odpovědět
17.12.2014 19:15
Avatar
mara
Člen
Avatar
Odpovídá na coells
mara:17.12.2014 19:31

Dobře děkuji moc. Klasický text už mě posílat šel, ale to jsem posílal pomocí printWriter-u a toto je pomocí něčeho jiného. Toto jsem bral z jakési ukázky.

Nahoru Odpovědět
17.12.2014 19:31
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:17.12.2014 19:51

za os.flush má být os.close() toho jsem si nevšiml, ale teď to pro změnu vyhodí totot
java.lang.Arra­yIndexOutOfBou­ndsException
at java.lang.Sys­tem.arraycopy(Na­tive Method)
at java.io.Buffe­redOutputStre­am.write(Buffe­redOutputStre­am.java:128)
at javaapplicati­on8.JavaAppli­cation8.main(Ja­vaApplication8­.java:43)

Nahoru Odpovědět
17.12.2014 19:51
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:23.12.2014 11:37

Ahojte udělal jsem to na počítači takto:
server:

package server001;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server001 {
    public static void main(String[] args) throws Exception {
        Server001 server01 = new Server001();
        ServerSocket server = new ServerSocket(4444);
        server01.accept(server);
    }
    public void accept(ServerSocket ss) throws Exception{
        Socket client = ss.accept();
        InputStream is = client.getInputStream();
        FileOutputStream fos = new FileOutputStream("/home/marek/Plocha/odeslano23.txt");
        int c;
        System.out.println("posilam");
        while((c = is.read()) != -1){
            System.out.println("1");
            fos.write(c);
        }
        System.out.println("sfsdf");
        is.close();
        fos.close();
    }
}

client:

package client001;

import java.io.*;
import java.net.Socket;

public class Client001 {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("192.168.1.13", 4444);
        OutputStream os = socket.getOutputStream();
        FileInputStream fis = new FileInputStream("/home/marek/images.jpeg");
        int i;
        while((i = fis.read()) != -1){
            os.write(i);
        }
        fis.close();
        os.flush();
        os.close();


    }
}

všechno normálně funguje, ale když jsem clienta předělal na mobil, tak se nic nepošle :(
client na mobilu vypaá takto:

button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Thread start = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Socket socket = new Socket("192.168.1.13", 4444);
                            OutputStream os = socket.getOutputStream();
                            File file = new File("/storage/sdcard0/soubor.txt");
                            FileInputStream fis = new FileInputStream(file);
                            int i;
                            int c = -1;
                            while((i = fis.read()) != c){
                                os.write(i);
                            }
                            fis.close();
                            os.flush();
                            os.close();
                        }catch(Exception e){
                            e.printStackTrace();
                        }

                    }
                });
                start.start();
            }
        });

To na počítači mi normálně funguje a to na mobilu nee :(

Nahoru Odpovědět
23.12.2014 11:37
Co na srdci, to na Facebooku
Avatar
coells
Tvůrce
Avatar
Odpovídá na mara
coells:23.12.2014 11:40

je mobil připojený přes wi-fi na lokální síť?

 
Nahoru Odpovědět
23.12.2014 11:40
Avatar
mara
Člen
Avatar
Odpovídá na coells
mara:23.12.2014 11:42

ano je :) aji všechny privilégia má. a teď jsem přišel na to, že jpg soubor to pošle normálně. jen to txt nechce poslat :( nevíš jakto ??
Díky

Nahoru Odpovědět
23.12.2014 11:42
Co na srdci, to na Facebooku
Avatar
coells
Tvůrce
Avatar
coells:23.12.2014 11:48

na server-side nemáš flush() output streamu

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
23.12.2014 11:48
Avatar
mara
Člen
Avatar
Odpovídá na coells
mara:23.12.2014 11:56

aha díky toho jsem si nevšiml... ale nevím jakto, ale tu fotku mi to poslalo aji bez toho
Díky moc :)

Nahoru Odpovědět
23.12.2014 11:56
Co na srdci, to na Facebooku
Avatar
coells
Tvůrce
Avatar
Odpovídá na mara
coells:23.12.2014 12:04

Buffer na streamu má obvykle velikost 2-10 kB, pro větší data (jpg) se zapisuje automaticky. Obrázek to zdánlivě poslalo, ale stejně tam chyběla data na konci.

Jinak dobrá práce s postupným vývojem, hezky krok za krokem!

 
Nahoru Odpovědět
23.12.2014 12:04
Avatar
mara
Člen
Avatar
Odpovídá na coells
mara:23.12.2014 12:08

jojo :) něco jsem si o tom načetl a hned je to lepší :) předtím jsem jen tupě opisoval kód :) díky moc :) ještě, že jsi mi to předtím hned neporadil. nikdy bych to neuměl :)

Nahoru Odpovědět
23.12.2014 12:08
Co na srdci, to na Facebooku
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.