Reading/Writing Objects from/to Sockets
I have a list of objects on the Server side that I want to write to a Client. The code on the Server side looks like this
Socket socket = serverSocket.accept( )
ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream());
for ( int i = 0 ; i < list.size ( ) ; i++)
oos.writeObject(list.get ( i ) ;
}On the Client side it looks like this
ServerSocket socket = new ServerSocket( 7000 )
socket.accept ( )
while( true )
ObjectInputStream ois = new ObjectInputStream( socket.getInputStream( ) )
Object obj = ois.readObject( )
}My question is; how to "mark" on the server side that I written all the objects, so that I know on the client side when to end reading objects ?
When dealing with bytes, to mark EOF one can do:
socket.write(new byte[1])on the server side
And on the client side
while( socket.read != -1 )to know when to quit reading.
You could just pass an EndObject that marks the end (e.g Byte or an own Object).
But I don't think you need this. Most collections are Serializable so you can just pass your list to the stream.
Similar Messages
-
Reading an object from a binary file
i am writing objects into my binary file using printwriter class. i am able to write objects into the file but i am having problems reading the object from the file. is there any other way of going about it. i tried using the objectoutputstream and object input stream class. but i am getting run time errors coz of something to do with serialization
i am storing records as a object into a binary file so that it is easy to seek my recordsOf course you have trouble reading objects after you wrote them with a PrintWriter.
You should rather have fixed the Serialization errors: only objkects that implement Serializable correctly can be serialized. -
How to read OLE objects from Access ??
Hi,
I have an field of type OLE in my Access Database table. This field has some files stored in it in the form of attachment. The file types of the OLE objects can be different (xls,txt,doc). Now, I want to query the database and find the extension of the files and save it occordingly using java.
I'm using the following now.
JdbcOdbcInputStream jois = (JdbcOdbcInputStream) rs .getBinaryStream("SupportingData");
byte[] supportingData = jois.readData();
String data = new String(supportingData);
I'm getting data in binary format and when I try to look into it, all I can see is the header info of the file.
Is there anyother way to read the OLE object easily ?
Please suggest.
Thanks,
MaryHow to read appended objects from file with ObjectInputStream? The short answer is you can't.
The long answer is you can if you put some work into it. The general outline would be to create a file with a format that will allow the storage of multiple streams within it. If you use a RandomAccessFile, you can create a header containing the length. If you use streams, you'll have to use a block protocol. The reason for this is that I don't think ObjectInputStream is guaranteed to read the same number of bytes ObjectOutputStream writes to it (e.g., it could skip ending padding or such).
Next, you'll need to create an object that can return more InputStream objects, one per stream written to the file.
Not trivial, but that's how you'd do it. -
How to read appended objects from file with ObjectInputStream?
Hi to everyone. I'm new to Java so my question may look really stupid to most of you but I couldn't fined a solution by myself... I wanted to make an application, something like address book that is storing information about different people. So I decided to make a class that will hold the information for each person (for example: nickname, name, e-mail, web address and so on), then using the ObjectOutputStream the information will be save to a file. If I want to add a new record for a new person I'll simply append it to the already existing file. So far so good but soon I discovered that I can not read the appended objects using ObjectInputStream.
What I mean is that if I create new file and then in one session save several objects to it using ObjectOutputStream they all will be read with no problem by ObjectInputStream. But after that if in a new session I append new objects they won't be read. The ObjectInputStream will read the objects from the first session after that IOException will be generated and the reading will stop just before the appended objects from the second session.
The following is just a simple test it's not actual code from the program I was talking about. Instead of objects containing different kind of information I'm using only strings here. To use the program use as arguments in the console "w" to create new file followed by the file name and the strings you want save to the file (as objects). Example: "+w TestFile.obj Thats Just A Test+". Then to read it use "r" (for reading), followed by the file name. Example "+r TestFile.obj+". As a result you'll see that all the strings that are saved in the file can be successfully read back. Then do the same: "+w TestFile.obj Thats Second Test+" and then read again "+r TestFile.obj+". What will happen is that the strings only from the first sessions will be read and the ones from the second session will not.
I am sorry for making this that long but I couldn't explain it more simple. If someone can give me a solution I'll be happy to hear it! ^.^ I'll also be glad if someone propose different approach of the problem! Here is the code:
import java.io.*;
class Fio
public static void main(String[] args)
try
if (args[0].equals("w"))
FileOutputStream fos = new FileOutputStream(args[1], true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (int i = 2; i < args.length ; i++)
oos.writeObject(args);
fos.close();
else if (args[0].equals("r"))
FileInputStream fis = new FileInputStream(args[1]);
ObjectInputStream ois = new ObjectInputStream(fis);
for (int i = 0; i < fis.available(); i++)
System.out.println((String)ois.readObject());
fis.close();
else
System.out.println("Wrong args!");
catch (IndexOutOfBoundsException exc)
System.out.println("You must use \"w\" or \"r\" followed by the file name as args!");
catch (IOException exc)
System.out.println("I/O exception appeard!");
catch (ClassNotFoundException exc)
System.out.println("Can not find the needed class");How to read appended objects from file with ObjectInputStream? The short answer is you can't.
The long answer is you can if you put some work into it. The general outline would be to create a file with a format that will allow the storage of multiple streams within it. If you use a RandomAccessFile, you can create a header containing the length. If you use streams, you'll have to use a block protocol. The reason for this is that I don't think ObjectInputStream is guaranteed to read the same number of bytes ObjectOutputStream writes to it (e.g., it could skip ending padding or such).
Next, you'll need to create an object that can return more InputStream objects, one per stream written to the file.
Not trivial, but that's how you'd do it. -
I can't read a Object from file, Please help me
i want to write a Object into File. this is code of Object
class objStoreCus implements Comparable, Serializable
String customerID = new String();
String customerName = new String();
String customerEmail = new String();
objStoreCus(String cusID, String cusName, String cusEmail)
customerID = cusID;
customerName = cusName;
customerEmail = cusEmail;
objStoreCus(){}
public int compareTo(Object o)
objStoreCus oS = new objStoreCus();
oS = (objStoreCus)o;
return(customerEmail.compareTo(oS.customerEmail));
private void writeObject(ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
try
s.defaultReadObject();
}catch(IOException ie){throw new IOException();}
catch(ClassNotFoundException cnt){throw new ClassNotFoundException();}
And I was wrote above Object into File by this code :+
FileOutputStream fos;
ObjectOutputStream oos;
FileInputStream fis;
ObjectInputStream ois;
public void writeObjToFile(objStoreCus obj)
try
fos = new FileOutputStream("Exrcise3.ex3", true);
}catch(FileNotFoundException fnfe){}
try
oos = new ObjectOutputStream(fos);
//ghi doi tuong vao file
oos.writeObject(obj);
//dong stream
oos.close();
fos.close();
}catch(IOException ie){}
But i can't read above Object from file. allway have a Exception occur "StreamCorruptedException".
this is code read Object form file :
*parameter is ArrayList will be store Object from file.
public void readObjFromFile(ArrayList al)
try
fis = new FileInputStream("Exrcise3.ex3");
}catch(FileNotFoundException fnfe){}
try
ois = new ObjectInputStream(fis);
while(true)
try
objStoreCus osc = new objStoreCus();
osc = (objStoreCus)ois.readObject();
System.out.println(osc.customerEmail);
}catch(Exception e)
e.printStackTrace();
//System.out.println();
break;
ois.close();
fis.close();
}catch(IOException ie){}
}Problem lies in
os = new FileOutputStream("Exrcise3.ex3", true);
You are trying to append to that file, You should always use new file to serialize objects.
os = new FileOutputStream("Exrcise3.ex3");
Try with above line. -
Reading int data from a socket
Hi!
I'm new here and I have a question. I'm reading bytes from a socket and I'm trying to get some integers from a byte array. But I have a problem. I'm able to read the byte array but i can't get correct int numbers from it. For example i have a byte array with following bytes:
10004000-82-72-109-84
When I read those int's with, for example DataInputStream.readInt() first two numbers i get are 16777216 and 67108864 but I know they should be 1 and 4. I know because this is what server sends and I get this reading data in some other languages for example C or even PHP. I even tried using ByteBuffer but with same wrong result. Maybe it has something to do with little/big endian or something, I don't know. Maybe somebody could tell me how to get correct numbers. Maybe I should do it other way than reading byte array... I have no idea... :(
Thanks!If you cannot change the transmitting application,
you'll have to compensate in your Java application
by using ByteBuffer in backward-endian mode.Well... I cannot change the transmitting application. Simply, I have no acces to it. I tried with using ByteBuffer with LITTLE_ENDIAN order and it worked. Thanks! -
Problem reading all data from Synchronous Socket
Hi,
I have the task to implements an C# application which communicates with a SAP system via HTTP. My application should act as a HTTP Server to the SAP system. SAP sends documents (PDFs, Word-Docs, Tifs) through HTTP-Requests to my Server. Archive Link is SAP´s name for that HTTP interface.
Currently I am using synchronous sockets to process the communication. So
basically I do something like this:
Thread th = new Thread(new ThreadStart(StartListenThreaded));
th.Start();
The method StartListenThread looks like this:
private void StartListenThreaded()
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint EndPoint = new IPEndPoint(ipAddress, port);
Socket ss = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ss.Bind( EndPoint);
ss.Listen(20);
try
while(true)
Console.WriteLine("rnServer is waiting for a new connection..rn");
Socket sock = ss.Accept();
Console.WriteLine("Accepted connection form:"+sock.RemoteEndPoint);
Connection con = new Connection(sock);
Thread t = new Thread(new ThreadStart(con.ProcessOneRequest));
t.IsBackground=true;
t.Priority=ThreadPriority.BelowNormal;
t.Start();
catch (System.Exception e1)
{ Console.WriteLine("An Exception Occurred while Listening :" +e1.ToString()); }
As mentioned above There are mostly some Word-Documents or PDF files send as the body of a request. So I need to parse the body and write the content to a file.
Currently I use this code to accomplish that:
while (true)
if(socket.Available == 0)
break;
n = socket.Receive(bytes);
if(n == 0)
break;
wr.Write(bytes,0,n); // wr is a BinaryWriter
Now my problem is that this loop breaks before all data is received from the socket. That means it runs into the socket.Available == 0 case and ends, but there is still data available. How did I find that out? Well during debugging the code.
With the debugger running and when stepping through the code, obviously leaves the SAP side more time to send its data.
When doing some Console.WriteLine() after the loop with the socket.Receive() I get results > 0. So there is still data available.
I am not asking an SAP question here. I am aware that the problem could also be on the SAP side. However I think it is a C# issue. Has anyone experienced similar problems with sockets? Am I doing something completely wrong in handling my socket? I also don´t think that I can use Asynchronous sockets beacuse I need to process incoming requests in a determined order.
I have also tryed to turn off Blocking mode by setting socket.Blocking = false but I found out that I cannon use that because I need NetworkStream at some point in my application and NetworkStream does not work without blocking mode.I have evaluated several other possibilities before starting to implement HTTP on a socket basis. I only have this choice.
I have had a detailed look at Cassini before, but since you mentioned it in your post I looked at it more closely and I think I found a solution for my Problem.
Cassini uses some code like the following to poll for more data in a request. I am now using this mechanism in my application and it works fine.
private int WaitForRequestBytes()
int availBytes = 0;
try
Console.WriteLine("socket.Available: " + socket.Available);
if (socket.Available == 0)
// poll until there is data
Console.WriteLine("Polling 100ms");
socket.Poll(100000 /* 100ms */, SelectMode.SelectRead);
if (socket.Available == 0 && socket.Connected)
Console.WriteLine("Polling 1sec");
socket.Poll(1000000 /* 1sec */, SelectMode.SelectRead);
// socket.Poll(10000000 /* 10sec */, SelectMode.SelectRead);
availBytes = socket.Available;
catch
return availBytes;
So thanks for putting me in the right direction.
Mirco -
Reading/Writing Data from a SQL Database
Hi,
I have a data structure called 'Quote' which contains a number of different variables and controls ranging from text boxes, check boxes and radio buttons, i need to be able to read and write this from a database.
First I think a description of my overall project is needed:
Project Description
I have been given a brief that basically says: i have to create a programmed solution in VB to solve a problem. This problem can be anything we like, and I personally have chosen to create a program that manages quotes for building Log Cabins (this is very contrived and far from anything someone would do in the real world).
My solution will allow a generic user to create a quote (using a form with controls such as text boxes, check boxes, radio buttons) , and then save this to file. These users may then wish to load/edit this quote at a later date, from another form.
Whilst completing this project, i'll only have up to about 5 records (quotes) within the system, so i dont need the ability to store hundreds of records. And each record will be relatively short, with only about 10-15 data items within the data structure.
Also the Admin (or business owner in this case) need to be able to view all saved quotes in a presentable format, and edit them if needs be, from within this same program.
This solution does not need to be absolutely perfect and 100% efficiently coded, or have all the bells and whistles a real-world program would have. This is for an A level computing project by the way.
So basically, i need to be able to read from the database (to populate a Data Grid (i imagine this is best way?)) and so Admin can access any quote and edit it (editing is not vital, but viewing/printing is. Maybe i should stop at just viewing any quote?). Also i need generic users to be able to fill in the Edit Quote form and then save this data into the database.
And is a data structure really required for me to use a database?
I've never used databases in VB before (but have used them elsewhere, mainly Access) and so am completely new to this. Any help will be much appreciated.
Thanksthis is just a dataset i created using the dataset designer.
OK, so i have the dataset called "MyDataSet".
I also have the following variables:
Code Snippet
Dim FloorSpace As Int32
Dim NoOfBedrooms As Int32
Dim NoOfBathrooms As Int32
Dim EnSuites As Int32
Dim LuxKitchen As Boolean
Dim LuxCabin As Boolean
Dim Flooring As Boolean
Dim VoiceLighting As Boolean
Dim SolarPanels As Boolean
Dim IntegralSound As Boolean
Dim WindowFrames As String
Each of which relates directly to a column in the dataset (data type matches too).
What i need to do now, is to save these variables as an additional record in MyDataSet. And then save MyDataSet to file, so it can be loaded again next time the program is run and more additional records added. (all files are local by the way).
how would i go about this? -
Use JNI to Read C++ Structure from a Socket
Hi all,
I'm new to JNI and I have a problem for reading a tcp stream from a C++ server in my Java client.
Does someone now if it's possible to use JNI to "cast" my tcp stream (array of byte) in a java structure (class of data) ?
I've heard about Struct class in Javolution, but it seems to work just for UDP. Should it works for TCP ?
Another possibility is to read byte per byte.
Thank you a lot for any help.
Jeremie.Suppose I have a String representation of hexadecimal
code, How to convert this to hexadecimal code like
String code =
"68FF74AEE3FA825627E1AA58E29D6863C148C735";
I have to convert code to original hexadecimal code.
How can I convert this one.
Any help from you will be great to me.
Thank you
MouliDo you mean how to convert that String into a byte array containing the values represented by the String? If so, this code might work.
String code = "FF74AEE3FA825627E1AA58E29D6863C148C735";
byte[] bytes = new byte[code.length()/2];
for(int i=0;i<code.length();i+=2) {
bytes[ i/2 ] = (byte) (Integer.parseInt(code.substring(i,i+2),16));
System.out.println(bytes[i/2]);
[/code -
Reading XML object from Request object
Hi,
We are using Flash in our web application in which we are sending an XML object using HTTP post method to a JSP where we need to parse the XML object and get the values. Can anyone tell how we can do it?In fact we are not getting error in our page. following is the error
Error: 500
Location: /team/par/getData10.jsp
Internal Servlet Error:
java.lang.IllegalArgumentException
at javax.servlet.http.HttpUtils.parseQueryString(HttpUtils.java:151)
at javax.servlet.http.HttpUtils.parsePostData(HttpUtils.java:254)
at org.apache.tomcat.util.RequestUtil.readFormData(RequestUtil.java:101)
at org.apache.tomcat.core.RequestImpl.handleParameters(RequestImpl.java:719)
at org.apache.tomcat.core.RequestImpl.getParameterValues(RequestImpl.java:259)
at org.apache.tomcat.core.RequestImpl.getParameter(RequestImpl.java:250)
at org.apache.tomcat.facade.HttpServletRequestFacade.getParameter(HttpServletRequestFacade.java:223)
at org.apache.jasper.servlet.JspServlet.preCompile(JspServlet.java:437)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:480)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:812)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:758)
at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:213)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
at java.lang.Thread -
Reading an Array of Objects from a .bin file!
Hey, at the moment I'm creating a program whereby I write a set of objects onto a bin file, in this case an array of objects with a String name/county, and int population/area.... I'm not trying to read it back from the bin file and encountering trouble! I've managed to get it working using plain objects, however I want to be able to read in arrays of objects. The file itself compiles, however during running I get this error
java.lang.NullPointerException
at RecordFiles.CoastalRead.main(CoastalRead.java:33)
at RecordFiles.__SHELL16.run(__SHELL16.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
Here is the program itself,
import java.io.*;
public class CoastalRead {
public static void main(String[] args) {
CoastalTowns towns[] = new CoastalTowns[50];
towns[0] = new CoastalTowns();
towns[1] = new CoastalTowns();
towns[2] = new CoastalTowns();
towns[3] = new CoastalTowns();
towns[4] = new CoastalTowns();
String name, county;
int population, area;
try {
FileInputStream fileIn =
new FileInputStream("CoastalTownsBin.bin");
ObjectInputStream in = new ObjectInputStream(fileIn);
for (int i = 0; i < towns.length; i++){
towns[i] =(CoastalTowns) in.readObject();
System.out.println("Deserialized File...");
System.out.println("Name: " + towns.name);
System.out.println("County: " + towns[i].county);
System.out.println("Population: " + towns[i].population);
System.out.println("Area: " + towns[i].area);
in.close();
fileIn.close();
} catch (IOException i) {}
catch (ClassNotFoundException c) {}
+I'd appreciate a fast reply!+ And if someone needs the writing class I've used, I can post it asap.CoastalTowns towns[] = new CoastalTowns[50];
towns[0] = new CoastalTowns();
towns[1] = new CoastalTowns();
towns[2] = new CoastalTowns();
towns[3] = new CoastalTowns();
towns[4] = new CoastalTowns();Why create an array with a size of 50 and then only fill 5 elements?
Why bother filling any elements at all when you are reading the objects from a file?
What happens if there are less than 50 objects in your file?
I will assume CoastalTowns holds info about a single town, so why is it pluralised? Do you have a class called Dog or Dogs, Chair or Chairs, Person or People?
} catch (IOException i) {}
catch (ClassNotFoundException c) {}DO NOT swallow exceptions. At the very least put in a call to printStackTrace so you know if/when an exception occurs.
I'd appreciate a fast reply!I typed as fast as I could but unfortunately I'm still and hunt and peck guy. -
Some files I can't read and write to my socket!?
I have the following code that writes files to my socket:
OutputStream out = new BufferedOutputStream(socket.getOutputStream());
File f = new File(SOME_PATH);
InputStream fin = new FileInputStream(f);
int n;
while((n = fin.read()) > 0) {
out.write(n);
out.flush();
fin.close();And the following reads this file from the socket, and writes it to another file on the server:
InputStream in = new BufferedInputStream(socket.getInputStream());
File f = new File(SOME_PATH);
OutputStream vos = new FileOutputStream(f);
int n;
for(int i=0;i<fileSize;i++) {
n = in.read();
vos.write(n);
vos.close();
vos = null;"fileSize" is always the size of the file, I'm pretty sure here.
I can transfer both binary and text files, but not all text files. Why is that? How do I fix it?Another way is to have an object that represents the file...and then it can contain the filename and other stuff...
public class MyFile
private String filename = "";
private byte[] filecontents = null;
}If you then use an ObjectOutput/InputStream then you can read the file in wholesale...
However if you are having "other" commands that you read from the stream then it wouldn't solve that problem!
Another way is to use the ISDN method, more complex but effective, that is to have a control channel and a data channel...i.e. one stream for sending commands, another for sending data in response to commands...one issue there though is that of synchronization...
Another potential method is to use XML to provide a "data envelope" that encapsulates the file...
i.e.
<file filename="[name]">
<![CDATA[
<!-- File contents go here, could be binary/plain text -->
]]>
</file>Of course using XML in this way has it's own problems...
Overall if you already have a working system in place then I'd stick with that, but those are some ideas!!! -
Reloading a single object from DB to cache
Hello:
We are using near+distributed caches with read-through/write-behind persistence to DB.
While doing support, sometimes we need to modify a single field of an object (for whatever reason).
It looks like Coherence way to do this would be map.put() resulting in async invocation of CacheStore. The problem in our case is that we do not have UI facilities for modifying object fields. Before Coherence we went to DB, modified a single row via SQL query and it was picked up by the app. It was very convenient since we did not have to reconstruct the object which often contains data from several tables, one or more rows from every table.
So the question is whether it is possible to make Coherence re-read an object from DB even if it is already in cache.
Thanks!One object but it differs for different users ?
Then it's an object per user, and you should store it in the session.
Why do you think this is a performance overhead ?
"Premature optimization is the root of all evil." -
Send Java objects through a socket
I want to send some java objects to a J2SE server from a J2me socket. In normal j2me socket there is no way of putting whole obejct to the output stream. Is there any way that you can send a object from a socket ? Please advice..
Thanks.Check this article on making serializable objects in MIDP. If the objects you want to send receive across the network implement this, then you can easily transform them into byte arrays and back to objects so they can be sent across a network.
shmoove -
Reading text from server socket stream
I have a basic cd input program i've been trying to figure out the following problem for a while now, the user enters the artist and title etc and then a DOM (XML) file is created in memory this is then sent to the server. The server then echos back the results which is later printed on a html page by reading the replys from the server line by line.
The server must be run it listens for clients connecting the clients connect and send DOM documents through the following jsp code.
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>
<%@page import="javax.xml.parsers.*"%>
<%@page import="org.w3c.dom.*"%>
<%@page import="org.apache.xml.serialize.*"%>
<%!
public static final String serverHost = "cdserver";
public static final int serverPort = 10151;
%>
<hr />
<pre>
<%
Socket mySocket = null; // socket object
PrintWriter sockOut = null; // to send data to the socket
BufferedReader sockIn = null; // to receive data from the socket
try {
// #1 add line that creates a client socket
mySocket = new Socket(serverHost, serverPort);
// #2 add lines that create input and output streams
// attached to the socket you just created
sockOut = new PrintWriter(mySocket.getOutputStream(), true);
sockIn = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
} catch (UnknownHostException e) {
throw e; // This time the JSP can handle the exception, not us
} catch (IOException e) {
throw e; // This time the JSP can handle the exception, not us
String cdTitle, cdArtist, track1Title, track1Time, track1Rating;
// Retrieve the HTML form field values
cdTitle = request.getParameter("cdtitle");
cdArtist = request.getParameter("cdartist");
track1Title = request.getParameter("track1title");
track1Time = request.getParameter("track1time");
track1Rating = request.getParameter("track1rating");
// Create a new DOM factory, and from that a new DOM builder object
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// Note that we are creating a new (empty) document
Document document = builder.newDocument();
// The root element of our document wil be <cd>
// It gets stored as the child node of the whole document (it is the root)
Element rootElement = document.createElement("cd");
document.appendChild(rootElement);
// Create an element for the CD title called <title>
Element cdTitleElement = document.createElement("title");
// Add a text code under the <title> element with the value that
// the user entered into the title field of the web form (cdTitle)
cdTitleElement.appendChild(document.createTextNode(cdTitle));
// Place the <title> element underneath the <cd> element in the tree
rootElement.appendChild(cdTitleElement);
// Create an <artist> element with the form data, place underneath <cd>
Element cdArtistElement = document.createElement("artist");
cdArtistElement.appendChild(document.createTextNode(cdArtist));
rootElement.appendChild(cdArtistElement);
// Create a <tracklist> element and place it underneath <cd> in the tree
// Note that it has no text node associated with it (it not a leaf node)
Element trackListElement = document.createElement("tracklist");
rootElement.appendChild(trackListElement);
// In this example we only have one track, so it is not necessary to
// use a loop (in fact it is quite silly)
// But the code below is included to demonstrate how you could loop
// through and add a set of different tracks one by one if you
// needed to (although you would need to have the track data already
// stored in an array or a java.util.Vector or similar
int numTracks = 1;
for (int i=0; i<numTracks; i++) {
String trackNum = Integer.toString(i+1);
Element trackElement = document.createElement("track");
trackElement.setAttribute("id", trackNum);
trackListElement.appendChild(trackElement);
// Track title element called <title>, placed underneath <track>
Element trackTitleElement = document.createElement("title");
trackTitleElement.appendChild(document.createTextNode(track1Title));
trackElement.appendChild(trackTitleElement);
// Track time element called <time>, placed underneath <track>
Element trackTimeElement = document.createElement("time");
trackTimeElement.appendChild(document.createTextNode(track1Time));
trackElement.appendChild(trackTimeElement);
// Track rating element called <rating>, placed underneath <track>
Element trackRatingElement = document.createElement("rating");
trackRatingElement.appendChild(document.createTextNode(track1Rating));
trackElement.appendChild(trackRatingElement);
OutputFormat format = new OutputFormat();
format.setIndenting(true);
// Create a new XMLSerializer that will be used to write out the XML
// This time we will serialize it to the socket
// #3 change this line so that it serializes to the socket,
// not to the "out" object
XMLSerializer serializer = new XMLSerializer(writer, format);
serializer.serialize(document);
// Print out a message to indicate the end of the data, and
// flush the stream so all the data gets sent now
sockOut.println("<!--QUIT-->");
sockOut.flush();
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
#4 add a while loop that reads text from the
server socket input stream, line by line, and prints
it out to the web page, using out.println(...);
Note that because the reply from the server will contain
XML, you will need to call upon the toHTMLString() method
defined below to escape the < and > symbols so that they
will display correctly in the web browser.
Also note that as you receive the reply back from the
server, you should look out for the special <!--QUIT-->
string that will indicate when there is no more data
to receive.
while ((fromServer = sockIn.readLine()) != null) {
out.println(sockIn.readLine());
// If the reply from the server said "QUIT", exit from the
// while loop by using a break statement.
if (fromServer.equals("QUIT")) {
out.println("Connection closed - good bye ...");
// Print the text from the server out to the user's screen
out.println("Reply from Server: " + fromServer);
// Now read a line of text from the keyboard (typed by user)
fromUser = stdIn.readLine();
// If it wasn't null, print it out to the screen, and also
// print a copy of it out to the socket
if (fromUser != null) {
out.println("Client: " + fromUser);
sockOut.println(fromUser);
// Close all the streams we have open, and then close the socket
sockOut.close();
sockIn.close();
mySocket.close();
%>
I'm suppose to modify the commented sections labled with #.
#1,2 are correct but i have doubts on the 3rd and 4th modification.
for #3 i changed so i serializes to the socket not to the "out" object:
from
XMLSerializer serializer = new XMLSerializer(out, format);
to
XMLSerializer serializer = new XMLSerializer(writer, format);
with "out" it prints out some of the results entered but it just hangs i'm thinking it might be the while loop that i added in #4. If i changed it to serialize the socket XMLSerializer serializer = new XMLSerializer(writer, format); it doesn't print out nothing at all; just a blank screen where it hangs.
I can post the rest of the code (server thats in java and cdinput.html) but since i want to keep my post short and if required i'll post it later on i also omitted some of the code where it creates the DOM textnodes etc to keep my post short.On your previous thread, why did you say the server was using http POST and application/xml content type when it quite obviously isn't, but a direct socket communication that abuses XML comments for message end delimiters?
The comments imply you need to wait for "<!--QUIT-->" on a line by itself, but your loop is waiting for "QUIT".
Pete
Maybe you are looking for
-
Can not find master data in the cube
ItemNo is an navigation attribute of 0Material. We are using 0material in a cube. When I display the cube data include ItemNo, I don't find the data I am looking for. For example: In 0Material: 0Material ItemNo Description AAA
-
How can I create a flash USB RT boot device?
Hi. I have a PXI 8174 controller and I know it's not supposed to run RT because it doesn't have a floppy drive. However I know that 8171 controllers can be set up to boot from an USB flash device. My question is, how can I make an RT-boot flash devic
-
I have a problem in the deployment of applications in managed server which was started by the Admin Server via Node Manager. Configuration information of Admin and Managed Servers Admin Server----> Standalone Server installation Windows 2000 Env Mana
-
Tips on Installing a new Time Machine??
I just upgraded to a iMac 27 and also purchased a 2TB Airport Time Capsule. I'm wanting to use this new Time Capsule as my Time Machine device and replace my previous 1TB external drive. Is there a best way to do that? Can I keep my old Time Machin
-
Hey Experts, If you have an HRFORM, type payslip/payroll, is it possible to have your infotype metastars retrieve ONLY the data valid on the selected period? For instance Period 1 goes from 01-01-2011 to 31-01-2011. As i see, it always fills the star