Solved

sending xml message in a java udp packet

Posted on 2008-06-12
11
1,523 Views
Last Modified: 2013-11-23
I'm trying to send an xml message to a Java SAX parser listening on a UDP port.
When I send a message the parser it gives the error message

 [Fatal Error] :1:1 Content is not allowed in prolog.

I've reduced my UDP packet to just the prolog and I still get the error

Here is what I'm sending

String xmlMsg = new String("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

byte buffer[] = xmlMsg.getBytes();
DatagramSocket sndSocket = new DatagramSocket();
sndSocket.send(new DatagramPacket(buffer,buffer.length,InetAddress.getByName("127.0.0.1"),Integer.parseInt("3031")));

I want to find out what I'm doing wrong and how do I send an XML message in a UDP packet that the SAX parser will accept?
0
Comment
Question by:mitchguy
  • 6
  • 5
11 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 21772083
>> [Fatal Error] :1:1 Content is not allowed in prolog.

That sounds more like an error with reading xml, not writing it. At what point are you getting that message
0
 

Author Comment

by:mitchguy
ID: 21772265
The reader is doing this

DatagramPacket incomingPacket = new DatagramPacket(buffer,buffer.length);
listenSocket.receive(incomingPacket);
byte data[] = incomingPacket.getData();
InputSource source = new InputSource(new StringReader(data.toString()));
fromXML(source);

private synchronized fromXML(InputSource in) throws Exception
{
  XMLReader xr;
  xr.setContentHandler(this);
  xr.parse(in);
}
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 21772450
>>InputSource source = new InputSource(new StringReader(data.toString()));

should be as below
InputSource source = new InputSource(new StringReader(new String(data)));

Open in new window

0
DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

 

Author Comment

by:mitchguy
ID: 21772538
I'm not sure I understand the difference between data.toString() and new String(data) ?

I made the change and ran it again I get this error listed below still



[Fatal Error] :1:39: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog

Which is actually a little different than before, the difference being
before the numbers after [Fatal Error] were 1:1 and now it is 1:39
The size of the message is 38 maybe I have some sort of missing character
that is supposed to be at the end of the data for the parser?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 21772641
Well  byte[] doesn't have a toString method that will be of any use to you. Can you instead do this and tell us what gets printed?
String s = new String(data);
System.out.println(data);
InputSource source = new InputSource(new StringReader(s));

Open in new window

0
 

Author Comment

by:mitchguy
ID: 21772798
The output is certainly not what I expected

[B@1113708

Since I'm sending and receiving on the same machine it shouldn't be a byte swap problem right?
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 125 total points
ID: 21772904
>>[B@1113708

That looks suspiciously like the output of data.toString, which i've already said not to use ..;-)
0
 

Author Comment

by:mitchguy
ID: 21773164
If I do this
String myString = new String(incomingPacket.getData());
The output is
<?xml version="1.0" encoding="UTF-8"?>

However after that I did
InputSource source = new InputSource(new StringReader(myString));

and unfortunately still got the error
[Fatal Error] :1:39: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 21773306
Well of course your software is expecting to parse a document. 'myString' is just a header. You need the rest of the doc in there too
0
 

Author Comment

by:mitchguy
ID: 21773433
That did the Trick:)
Thanks!
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 21773461
:-)
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
configure dependency in POM for new database 3 25
tomcat startup error 5 59
servlet example 17 29
Java string replace 11 43
By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
The viewer will learn how to implement Singleton Design Pattern in Java.

786 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question