如何用json在android中实现服务器和客户端

时间:2015-04-02 08:52:07

标签: android json server

我有一个关于本地服务器和解析JSON的问题。我必须为学校申请,你必须用一个带有IP和端口的本地服务器解析JSON。

这是服务器类:

/**
* Created by Charlie on 26-3-2015.
*/
public class Server extends AsyncTask<Void, Void, String> {

private String message;
private String ip;
public static int port = 4444;
private String serverResponse = null;

public Server(String ip, int port, String message ) {
    super();
    //IP, Port en bericht om naar server te sturen
    this.message = message;
    this.ip = ip;
    this.port = port;
}

@Override
protected String doInBackground(Void... params) {
    try {
        Socket serverSocket = new Socket();
        serverSocket.connect(new InetSocketAddress(this.ip, this.port), 4444);

        this.sendMessage(message, serverSocket);

        InputStream input;

        try {
            input = serverSocket.getInputStream();
            BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(input));
            String line = "";
            StringBuilder stringBuilder = new StringBuilder();
            while ((line = responseStreamReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            responseStreamReader.close();

            this.serverResponse = stringBuilder.toString();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        System.out.println("Response: " + serverResponse);

    } catch (UnknownHostException e) {
        Log.d("debug", "can't find host");
    } catch (SocketTimeoutException e) {
        Log.d("debug", "time-out");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return serverResponse;
}

private void sendMessage(String message, Socket serverSocket) {
    OutputStreamWriter outputStreamWriter = null;

    try {
        outputStreamWriter = new OutputStreamWriter(serverSocket.getOutputStream());
    } catch (IOException e2) {
        e2.printStackTrace();
    }

    if (outputStreamWriter != null) {
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        PrintWriter writer = new PrintWriter(bufferedWriter, true);

        writer.println(message);
    }
}
 }

这是一个调用数据的类:

public class HoofdschermFragment extends android.app.Fragment {

public static String serverIp;
public static int serverPort = 4444;
public static ArrayList<String> slotenLijst;
public static ArrayList<JSONObject> beknopteInformatieSlotlijst;
public static String informatieslotbeknopt = null;
private static View rootview;
private Spinner sloten_spinner;
public static String SlotNaam;
public static Boolean initieleVerbinding = true;
public static int GeselecteerdSlot;
public static int GeselecteerdePositie;

public static android.app.Fragment fragmentslotinformatie = new InformatieSlotFragment();

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootview = inflater.inflate(R.layout.fragment_hoofdscherm, container, false);

    //als eerste keer verbinding is, haal alles op uit server, zo niet, laatst opgehaalde data weer invullen
    if(initieleVerbinding == true) {
        dataOphalen();
        dataInvullen();
    } else {
        dataInvullen();
        sloten_spinner.setSelection(GeselecteerdSlot);
    }
    return rootview;
}

public void dataOphalen() {

    //ophalen van de services
    slotenLijst = new ArrayList<String>();
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("slotenlijst", "");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String response = null;
    try {
        try {
            // Dit IP adres moet IP adres van server zijn.
            response = new Server(serverIp,
                    serverPort, jsonObject.toString()).execute().get();

        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }
    if (response == null) {

        Toast.makeText(rootview.getContext(), "Kan helaas geen verbinding maken met de server.", Toast.LENGTH_LONG).show();
    } else {
        // Haal de null naam weg van de JSONArray (Voorkomt error)
        String jsonFix = response.replace("null", "");

        JSONArray JArray = null;
        try {
            JArray = new JSONArray(jsonFix);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        JSONObject jObject = null;
        String value = null;
        slotenLijst = new ArrayList<String>();

        //zet alle services in een JArray
        for (int i = 0; i < JArray.length(); i++) {
            try {
                jObject = JArray.getJSONObject(i);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            try {
                value = jObject.getString("Slot");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            slotenLijst.add(value);

        }
        // korte informatie over elke dienst ophalen, in een ArrayList zetten als JSONObjecten
        beknopteInformatieSlotlijst = new ArrayList<JSONObject>();
        JSONObject beknoptjObject = new JSONObject();
        try {
            for (int i = 0; i < slotenLijst.size(); i++) {
                beknoptjObject.put("Informatiebeknopt", slotenLijst.get(i));
                try {
                    try {
                        informatieslotbeknopt = new Server(serverIp,
                                serverPort, beknoptjObject.toString()).execute().get();
                        //exceptions afvangen
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                String infoFix = informatieslotbeknopt.replace("null", "");
                JSONObject fixedjObject = new JSONObject(infoFix);
                beknopteInformatieSlotlijst.add(fixedjObject);

                Log.i("Informatiebeknopt", infoFix);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        //aangeven dat app al eens eerder gedraait heeft
        initieleVerbinding = false;

    }


    // Locate the spinner in activity_main.xml
    sloten_spinner = (Spinner) rootview.findViewById(R.id.spinner);

    // Spinner adapter

    sloten_spinner
            .setAdapter(new ArrayAdapter<String>(rootview.getContext(),
                    android.R.layout.simple_spinner_dropdown_item,
                    slotenLijst));

    // Spinner on item click listener
    sloten_spinner
            .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0,
                                           View arg1, int position, long arg3) {
                    // Locate the textviews in activity_main.xml
                    TextView beknopteinfoslot = (TextView) rootview.findViewById(R.id.textviewbeknoptinfoslot);

                    try {
                        // Set the text followed by the position
                        beknopteinfoslot.setText(beknopteInformatieSlotlijst.get(position).getString("Informatiebeknopt"));
                        SlotNaam = slotenLijst.get(position);

                    } catch (Exception e) {

                    }

                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                }
            });

}

//opgehaalde data in de spinner zetten en beknopte tekst over diensten weergeven
private void dataInvullen() {
    // Locate the spinner in activity_main.xml
    sloten_spinner = (Spinner) rootview.findViewById(R.id.spinner);

    // Spinner adapter
    sloten_spinner
            .setAdapter(new ArrayAdapter<String>(rootview.getContext(),
                    android.R.layout.simple_spinner_dropdown_item,
                    slotenLijst));

    // Spinner on item click listener
    sloten_spinner
            .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0,
                                           View arg1, int position, long arg3) {
                    // TODO Auto-generated method stub
                    // Locate the textviews in activity_main.xml
                    TextView beknopteinfo = (TextView) rootview.findViewById(R.id.textviewbeknoptinfoslot);

                    try {
                        // Set the text followed by the position
                        beknopteinfo.setText(beknopteInformatieSlotlijst.get(position).getString("informatieslotbeknopt"));
                        SlotNaam = slotenLijst.get(position);
                        getActivity().setTitle(SlotNaam);
                    } catch (Exception e) {

                    }

                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub
                }
            });

    //naar servicepagina navigeren en dus informatie ophalen over de geselecteerdePositie
    Button infoslotbutton = (Button) rootview.findViewById(R.id.infoslotbutton);
    infoslotbutton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            GeselecteerdePositie = sloten_spinner.getSelectedItemPosition();
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.container, fragmentslotinformatie)
                    .commit();
        }
    });

}
  }

我还有一个用户可以填写IP的活动,以便应用程序可以与给定IP的服务器建立连接。
我知道如何弄清楚我自己的本地IP地址。我的老师还提供了ClientCommunicator类,SlotData类和其他类。我不明白的是,如何实现这些类以使我的应用程序解析JSON数据?

ClientCommunicator类:

  static ArrayList<String> getCategories() 
{
    categorielijst = new ArrayList<String>();

    //aanmaken van een nieuwe jsonobject
    JSONObject categorieJObject = new JSONObject();
    try 
    {
        //verzenden van het jsonobject wat de server verwacht
        categorieJObject.put("categorielijst", "" );
    } 
    catch (JSONException e) 
    {
        e.printStackTrace();
    }

    String response = null;
    try 
    {
        try 
        {
            //servercommunicator om verbinding te maken met de server
            response = new ServerCommunicator( activity, url, 4444,    categorieJObject.toString()).execute().get();
        } 
        catch (ExecutionException e) 
        {
            e.printStackTrace();
        }
    } 
    catch (InterruptedException e1) 
    {
        e1.printStackTrace();
    }
        //om errors te voorkomen
        String jsonFix = response.replace("null", "");

        JSONArray categorieJArray = null;
        try 
        {
            categorieJArray = new JSONArray(jsonFix);
        } 
        catch (JSONException e) 
        {
            e.printStackTrace();
        }

        JSONObject jObject = null;
        String value = null;
        categorielijst = new ArrayList<String>();

        for (int i = 0 ; i < categorieJArray.length(); i++) 
        {
            try 
            {
                jObject = (JSONObject) categorieJArray.getJSONObject(i);
            } 
            catch (JSONException e) 
            {
                e.printStackTrace();
            }
            try 
            {
                value = jObject.getString("naam");
            } 
            catch (JSONException e) 
            {
                e.printStackTrace();
            }
            categorielijst.add(value);
        }
        //geef de lijst met categorie�n terug zodat deze in de spinner geplaatst kan worden
        return categorielijst;
    }

SlotData类:

  package hsl.imtpmd.eindopdrachtserver;

  import java.util.HashMap;

 public class SlotData
{
//singleton
private static SlotData _instance;
public static SlotData getInstance()
{
    if( _instance == null )
        _instance = new SlotData();

    return _instance;
}



private String[] sloten = { "Sleutel slotsystemen", "RFID slotsystemen", "Biometrische slotsystemen"};
private HashMap<String, String> slotInfo;
private HashMap<String, String> slotInfoBeknopt;

private SlotData()
{   
    slotInfo = new HashMap<String,String>();
    slotInfoBeknopt = new HashMap<String,String>();

    slotInfo.put( "Sleutel slotsystemen", "De meest eenvoudige vorm van beveiliging zijn sloten die per sleutel geopend kunnen worden. Dit is een relatief goedkoop systeem maar brengt enige veiligheidsproblemen met zich mee. Voor beveiliging van ruimtes die weinig waardevolle zaken bevatten is dit systeem een uitstekende uitkomst." );
    slotInfo.put( "RFID slotsystemen", "RFID authenticatie is met de huidige techniek snel en gemakkelijk te implementeren om elke ruimte af te sluiten. Dankzij de digitalisering kunnen gebruikers getraceerd worden en bestaat de mogelijkheid een geschiedenis van ruimtegebruik aan te leggen. Dit resulteert in verhoogde beveiliging." );
    slotInfo.put( "Biometrische slotsystemen", "Biometrische authenticatie en authorizatie is de meest geavanceerde vorm van beveiliging. Dit systeem werkt nagenoeg feilloos en garandeerd een zeer hoge veiligheid van uw waardevolle bezittingen. Biometrische authorizatie kan op verschillende niveaus worden toegepast, van vingerafdruk tot irisscan." );

    slotInfoBeknopt.put( "Sleutel slotsystemen", "Eenvoudig, snel en goedkoop uw bezit achter slot en grendel!" );
    slotInfoBeknopt.put( "RFID slotsystemen", "Digitale beveiliging voor 100% zekerheid!" );
    slotInfoBeknopt.put( "Biometrische slotsystemen", "Authenticatie en authorizatie op persoonlijk niveau!" );
}

public String[] getSloten()
{
    return sloten;
}

public String getInformatie( String slot )
{
    return slotInfo.get( slot );
}

public String getInformatieBeknopt( String slot )
{
    return slotInfoBeknopt.get( slot );
}
 }

另一堂课:

 package hsl.imtpmd.eindopdrachtserver;

 import javax.swing.JFrame;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;

 public class DeSleutelaar extends JFrame
{
private Server server;

public DeSleutelaar()
{
    this.setDefaultCloseOperation( EXIT_ON_CLOSE );
    this.setSize( 400, 400 );
    this.setLocationRelativeTo( null );

    JTextArea textArea = new JTextArea();
    textArea.setWrapStyleWord( true );
    textArea.setEditable( false );
    JScrollPane scrollPane = new JScrollPane( textArea );
    this.add( scrollPane );

    this.setVisible( true );

    server = new Server( textArea );
}


@Override
public void finalize()
{
    server.requestStop();
}


public static void main( String[] args )
{
    new DeSleutelaar();
}
}

提前致谢!

0 个答案:

没有答案