Java Program To Send an XML File From Server to Client and Display it as Table

java program send xml file process cml file display as table java code xml parser
XML parsed and displayed as a table
In this post, i am writing a java program which will send an XML file over the network from Server to Client using Socket connection (TCP connection) and the client displays the received file as a table using swing. This program is based on my network lab experiment at college. The problem was:

Write a Program to read an xml file stored in the server. A client connected to the server gets the file and display the contents in a table using swing. The xml file contains details of books with the following fields.


  • Title of the book
  • Author of book
  • Publisher of book
  • Price of book
  • Price of book
  • Number of pages in the book

 A sample xml file:

<BOOKS>
<BOOK>
<TITLE>Time Machine</TITLE>
<AUTHOR>H.G Wells</AUTHOR>
<PUBLISHER>William Heinemann</PUBLISHER>
<PRICE> 100 Rs</PRICE>
<PAGES> 500 </PAGES>
</BOOK>
<BOOK>
<TITLE>Swami and His friends</TITLE>
<AUTHOR>RK narayanan</AUTHOR>
<PUBLISHER>Hamilton</PUBLISHER>
<PRICE> 250 Rs</PRICE>
<PAGES> 100 </PAGES>
</BOOK>
<BOOK>
<TITLE>Harry potter</TITLE>
<AUTHOR>J K Rowling</AUTHOR>
<PUBLISHER>Bloomsbury</PUBLISHER>
<PRICE> 600 Rs</PRICE>
<PAGES> 800 </PAGES>
</BOOK>
</BOOKS>


The java program to send xml files of above format over network and display it as a table at client side is as follows:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileNameExtensionFilter;

public class XMLTable extends JFrame{
JLabel lbl=new JLabel();
ServerSocket ss;
Socket s;
ArrayList<Book> books;
boolean server;
File xml;
String received=null;
public XMLTable(boolean mod)
{
try{
server=mod;
setLayout(null);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
add(lbl);
lbl.setBounds(10,10,370,370);
if(server)
    {
    JFileChooser jfc=new JFileChooser();
    jfc.setFileFilter(new FileNameExtensionFilter("xml file","xml"));
    jfc.removeChoosableFileFilter(jfc.getAcceptAllFileFilter());
    jfc.setDialogTitle("Select xml file");
    if(jfc.showOpenDialog(this)==JFileChooser.APPROVE_OPTION)
        {
        xml=jfc.getSelectedFile();
        }
    else
        System.exit(0);
    lbl.setText("<HTML><font size=\"4\">File Selected.<br/>Waiting for connection..<br/>IP:"+InetAddress.getLocalHost().getHostAddress()+"</font></html>");
    setVisible(true);
    ss=new ServerSocket(33333);
    ss.setSoTimeout(0);
    s=ss.accept();
    thread.start();
    }
else
    {
    String ip=JOptionPane.showInputDialog("Enter IP of server.");
    lbl.setText("<HTML><font size=\"4\">Trying to connect..</font></html>");
    setVisible(true);
    s=new Socket(InetAddress.getByName(ip),33333);
    thread.start();
    }
}catch(Exception ex){ex.printStackTrace();}

}

public void CreateTable(String received)
{
String temp=received;
try{
int i=0,j;
books=new ArrayList<>();
while((i=temp.indexOf("<BOOK>",i))!=-1)
    {
    Book b=new Book();
    i=temp.indexOf("<TITLE>",i)+7;
    j=temp.indexOf("</TITLE>",i);
    b.title=temp.substring(i,j);
    i=j+8;
    i=temp.indexOf("<AUTHOR>",i)+8;
    j=temp.indexOf("</AUTHOR>",i);
    b.author=temp.substring(i,j);
    i=j+9;
    i=temp.indexOf("<PUBLISHER>",i)+11;
    j=temp.indexOf("</PUBLISHER>",i);
    b.publisher=temp.substring(i,j);
    i=j+12;
    i=temp.indexOf("<PRICE>",i)+7;
    j=temp.indexOf("</PRICE>",i);
    b.price=temp.substring(i,j);
    i=j+8;
    i=temp.indexOf("<PAGES>",i)+7;
    j=temp.indexOf("</PAGES>",i);
    b.pages=temp.substring(i,j);
    i=j+8;
    i=temp.indexOf("</BOOK>",i)+7;
    books.add(b);
    System.out.println("book:"+b);
    }
String htmlcode="<HTML><table border=\"1\"><tr><th>Title</th><th>Author</th><th>Publisher</th><th>Price</th><th>Pages</th></tr>";
for(i=0;i<books.size();i++)
    {
    htmlcode+="<tr><td>"+books.get(i).title+"</td><td>"+books.get(i).author+"</td><td>"+books.get(i).publisher+"</td><td>";
    htmlcode+=books.get(i).price+"</td><td>"+books.get(i).pages+"</td></tr>";
    }
htmlcode+="</table></html>";
lbl.setText(htmlcode);
}catch(Exception ex){ex.printStackTrace();}
}

public static void main(String args[])
{
int resp=JOptionPane.showOptionDialog(null,"Choose one of the options","What to dd?",JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE, null,new String[]{"Act as Server","Act as Client"},"Act as Server");
if(resp==0)
    new XMLTable(true);
else if(resp==1)
    new XMLTable(false);
}

Thread thread=new Thread()
{
public void run()
{
try{
BufferedReader br;
if(server)
    {
    lbl.setText("<HTML><font size=\"4\">Connected.<br/>Sending XML File.</font></html>");
    br=new BufferedReader(new FileReader(xml));
    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
    String l=null;
    while(true)
        {
        l=br.readLine();
        if(l==null||l.equals(""))
            break;
        pw.println(l);
        }
    System.out.println("out of loop");
    ss.close();
    s.close();
    }
else
    {
    lbl.setText("<HTML><font size=\"4\">Connected.<br/>Receiving xml</font></html>");
    br=new BufferedReader(new InputStreamReader(s.getInputStream()));
    String l="";
    s.setSoTimeout(1500);
    while((l=br.readLine())!=null)
        {
        received+=l+"\n";
        System.out.println(l);
        }
        System.out.println("out of loop");
    if(received.equals("")==false)
        CreateTable(received);
    else throw new Exception("Connection interrupted");
    }
}catch(Exception ex){ex.printStackTrace();}
}
};
}

class Book
{    
public String title;
public String author;
public String publisher;
public String price;
public String pages;
}

No comments:

Post a Comment