ObjectStreams
Scenario: I have a Tomcat servlet engine running on a server.
Tomcat is connected to a MySQL database.
I have written an applet in Java which polls every 5 seconds (URLConnection)
to a servlet. The servlet replies whether there are updates available. When there are
updates available they get transmitted to the client. Think of thousands of objects that get transmitted to the client.
The communication process all runs with (zipped) ObjectOutputStream and ObjectInputStream.
Problem: The transfer speed is roughly in the beginning 1MB/s but the longer the client is connected and the more objects are streamed, the speed
drops down to 400 KB/s. This happends out of the blue. Also why is 1MB/s a limit? Why not 10MB or 50MB?
My question: Can someone summarize what steps Java does hardware-wise when using ObjectOutputStream and ObjectInputStream?
I've read the API and know the technique behind object serialization and how Java handles this all.
I am interested in knowing where the bottleneck lies. When I look at my CPU, it is barely in use. (10%).
When I look at RAM, I notice -nothing- is swapping. Disk I/O isn't extraordinairy high as well..
Finally as a sidenote, caching of ObjectStreams is unshared. Meaning objects arent cached.
Im guessing you're aiming at HttpURLConnection.
I'm not using that. Also not sure if that was an advise to start using it...
I've decided to add some code to give an impression how it works.
private URLConnection CreateConnection(URL urlServlet) throws IOException
URLConnection connection = urlServlet.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "application/x-java-serialized-object");
return connection;
public static Poll doPollingRequest(URLConnection urlCon, Poll pollObj) throws ClassNotFoundException
OutputStream outstream = null;
Poll replyPoll = null;
try
outstream = urlCon.getOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(outstream);
ObjectOutputStream oos = new ObjectOutputStream(gout);
oos.writeObject(pollObj);
oos.flush();
oos.close();
InputStream instr = urlCon.getInputStream();
GZIPInputStream gin = new GZIPInputStream(instr);
ObjectInputStream inputFromServlet = new ObjectInputStream(gin);
replyPoll = (Poll) inputFromServlet.readObject();
inputFromServlet.close();
gin.close();
instr.close();
} catch (IOException ex)
Logger.getLogger(Polling.class.getName()).log(Level.SEVERE, null, ex);
} finally
try
outstream.close();
} catch (IOException ex)
Logger.getLogger(Polling.class.getName()).log(Level.SEVERE, null, ex);
return replyPoll;
}The doPollingRequest works with a "Poll" object. There are all kinds of objects that get streamed to update or alter the client after the client requests them.
Similar Messages
-
Communication between servlet & rich client - ObjectStream or OutputStream?
Hi,
I need to send a text file from a servlet to a rich client. Is it better to send it over OutpputStream or wrap it up as an Object(eg: StringBuffer) and send it over OutputStream?
Will the performance be significantly be affected if I try to wrap the file into an object at the Servlet's end and send it over ObjectStream? We are planning to wrap all responses from the servlet into a generic response object (containing data, exceptions and error codes if any) and send it to the client
Please advice. Thanks in advance!Using object streams will create some protocole overhead. But you can minimize the effect by using compression.
Ex:- java.util.zip.GZIPOutputStream & GZIPInputStream
If you have already decided to use a genaric responce object then it will be good to have a generic request object too that will make your communication more flexible.
But remember when you are doing serialization you might get problems when having different java versions in different ends if your object structures use data structures provided by java API (Ex:- Collections). You can work arround this problem (In most cases) by implementing custom serialization using writeReplace and readResolve methods. -
ObjectStream communication between servlet and rich client
Hi,
I need to send multiple objects from a servlet to a rich client.
Is it possible to send 2 objects of different types at the same time - ie, a hashtable and a custom object by writing them one after another into the response's ObjectOutputStream?
Also, if I have two vectors containing different object types, say a Vector of Strings and a Vector of custom objects, how do I read the ObjectStream at the client end to get these two objects? Do I read two Vectors from the ObjectInputStream and then check the contained object using instanceOf?
In the above scenarios, is it better to wrap the entire set of objects with a serialized wrapper class and send that single object from the server to the client?
Please advice. Thanks in advance!You can send any number of objects in a stream one after other. If they are in different types/classes then you have to be carefull when casting to the specific types at the other end becouse if you try to cast to wrong type you get a runtime exception.
Normally when you receive the objects you will know in advande (programming time) which vector comes first in the stream so you can treat them acordingly.
Since both of them are vectors you can cast them to vector references at the read end and can tread the elements of the first vectors as strings and the elements of the other vectors as something else provided that the client always send the string vector first.
Whether to make it a single object or ot is a design decision that you have to make. It it make sence to put those two vectors together(logically related) then its better to do so. -
Objectstreams... how do they work???
Hi,
I am trying to write a program that uses objectstreams but i can't get it to work properly. I have found about the initialisation-sequence but i still get a streamcoprruptedexception. I am wondering if I should do something extra for it to work? who has tips and tricks on the matter???
thanxpublic void run() {
String Str;
Object o;
try {
//Send(server.WelcomeMsg);
while ((o = ois.readObject()) != null) {
//System.out.println(Str);
Str = (String) o;
if ("quit".equals(Str)) break;
try {
String Params[] = Str.split(" ");
for(int i=0;i<ActionMap.size();i++) {
//System.out.println((String)((Event)(ActionMap.get(i))).Name);
Event e = (Event)ActionMap.get(i);
if (Params[0].equals(e.Trigger)) {
e.actionPerformed(Params);
if ((Params[0].startsWith("$")) && ("end".equals(Params[1]))) {
ActionMap.remove(i);
break;
} catch (Exception ex) {ex.printStackTrace(); }
} catch (Exception ex ) { ex.printStackTrace(); }
finally {
System.out.println("Disconnected! ID="+ID);
try {
socket.close();
} catch (Exception ex) { ex.printStackTrace(); }
} -
Arraylist Improperly transfered through ObjectStreams
code from client:
public void listen()
String readtext;
field.setText("");
System.out.println("Starting to Listen");
while(!socket.isClosed()){
try{
dataType obj = (dataType)(in.readObject());
switch(obj)
case String:
readtext = in.readUTF();
field.append(readtext);
System.out.println("Text recieved: " + readtext);
break;
case Userlist:
System.out.println("USERLIST UPDATE");
setUserList((Userlist)(in.readObject()));
break;
} catch (IOException e){}
catch(ClassNotFoundException cnfe){cnfe.printStackTrace();}
private void setUserList(Userlist ul)
System.out.println((ul.size()) + " Users");
userlist.removeAll();
for(int i = 0; i < ul.size(); i++)
userlist.add(((User)(ul.get(i))).getName());
}code from server's client threads:ClientWorker(Socket client, Server s) {
this.client = client;
this.server = s;
public void run(){
String line;
try{
in = new ObjectInputStream(client.getInputStream());
out = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
try{
String userName = in.readUTF();
This = new User(userName);
server.UserNames.add(This);
server.updateList();
userset = true;
} catch(IOException ieo){}
...code from server: public void updateList()
System.out.println((UserNames.size()) + " Users");
for(int i = 0; i < Users.size(); i++)
try{((ClientWorker)Users.get(i)).getOutputStream().writeObject(dataType.Userlist);
((ClientWorker)Users.get(i)).getOutputStream().writeObject(UserNames);
catch(IOException e){e.printStackTrace();}
}this code improperly prints the userlist (extends Arraylist) usernames object from the server to the clients
for one client, userlist usernames.size() = 1, works for both server and client...
for two clients:
client one:
userlist usernames.size() = 1 <- incorrect
client two:
userlist usernames.size() = 2 <- correct
it seems that after the first time the server sends the client the list that the list doesnt change on the client even though it is sending the same userlist object to all the clientsYour posted code is too fragmented to get clear understanding but if you are sending a same object repeatedly, try using writeUnshared() method instead of writeObject().
-
ApartmentWriterProgram asks information about appartments
and saves it to a file with help of ApartmentFileHandler.
There happens IOException in the method write(Apartment apartment)
because class Apartment doesn't implement Serializable as it should (I use ObjectOutputStream).
Apartment has given me in class-file, so I can't change it to implement Serializable.
Is there still some other way to use Object Streams?
Can I make a subclass that implements Serializable, does it help?
I hope somebody will like to check my code. Thank you very much.
I have javadocs and class-files about:
Space
public abstract class Space extends Object
public Space()
public abstract String getType()
public abstract double getSize()Room
public class Room extends Space
public Room(String type,
double area)
public String getType()
public double getSize()Apartment
public class Apartment extends Space
public static final String KITCHEN
public String getType()
public double getSize()
public Room[] getRooms()---------------------------------------------------
java-code:
public class ApartmentFileHandler extends Object implements Serializable {
private OutputStream outStream;
private ObjectOutputStream obStream;
private String filePath;
public ApartmentFileHandler(String filePath) {
this.filePath = filePath;
/** Writes the given apartment data in the file. If the file already
exists, the old contents are overwritten.
Parameters:
apartment - the apartment to be written in the file
Throws:
IOException - if other problems arose when handling the file (e.g. the
file could not be written)
public void write(Apartment apartment)
throws IOException {
outStream = new FileOutputStream(filePath);
obStream = new ObjectOutputStream(outStream);
obStream.writeObject(apartment);
java-code:
import java.io.*;
import java.util.*;
public class ApartmentWriterProgram
extends Object
private KeyboardReader keyboardReader;
private List roomsInList;
private Room[] rooms;
private int numberOfRooms;
private String file;
public ApartmentWriterProgram()
this.keyboardReader = new KeyboardReader();
this.roomsInList = new ArrayList();
this.rooms = new Room [numberOfRooms];
/** Runs the writer program. The program asks the user for some
apartment data and a file name, and saves the data in the file. */
public void run() {
try {
numberOfRooms = keyboardReader.getInt("Give number of rooms: ");
for (int i =1; i<numberOfRooms+1; i++) {
String type =keyboardReader.getString("Give " +i+ ". " + "type of the room: ");
double area =keyboardReader.getDouble("Give " +i+ ". " + "area of room: ");
Room room= new Room(type, area);
this.roomsInList.add(room);
roomsInList.toArray(rooms);
Apartment apartment = new Apartment(rooms);
System.out.println();
file = keyboardReader.getString("Give name of the file: ");
ApartmentFileHandler handler = new ApartmentFileHandler(file);
handler.write(apartment);
} catch (IOException ioe) {
System.out.println("Writing to file "+file+ " failed.");
public static void main(String[] args) {
ApartmentWriterProgram program = new ApartmentWriterProgram();
program.run();Dont you have the source of the 'Appartment' with you? If you have
it, implement serialzable in it. You cant serialze and object unless
it implement it.I have only a compiled class-file of "Appartmet". Not the source. :(
I have javadoc of it, so I see which methods is there.
If you cant do the above, then make another custom class that holds
the information from the appartment(But it shouldnot have any
reference to the appartment, rather has all the fields correspondig
to it), and serialize this custom class..Good idea but
this is quite complicated. I dont know how to do it.
Or save the data in custom format.. ie, instead of serializng the
whole 'appartment' class, get the required fields in it, and write
those to the file.how to get the fields? -
Help, experiencing minor bugs in program
this is supposed to use rectangles and you should be able to load and save and they have colors and do a few more things with them, the loading is where it doesn't work.
*-------------------------------------------------------------- 80 columns ---|
* This is the main class for the application. It is built along the same
* lines as the Editor class of project 1. It has a constructor, two instance
* methods, and a static main() that kicks the whole thing off.
* The two instance methods are a menu creation method, and a menuItems
* initialisation method. The constructor instantiates the window
* and sets up its internals by creating and installing the drawing canvas,
* toolbar, and menus. All of the code works correctly as is and should
* require no changes.
* @version 1.1 15/04/01
* @author Julie Zelenski
* @author Restructured by Ian A. Mason
* @see javax.swing.JFrame
* @see javax.swing.JMenuBar
* @see javax.swing.JMenuItem
* @see javax.swing.JMenu
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JavaDraw extends JFrame {
final Toolbar toolbar = new Toolbar();
final DrawingCanvas canvas = new DrawingCanvas(toolbar, 350, 350);
final int menuMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
final JMenuBar mb = new JMenuBar();
final String[]
fileMenuItems = {"Clear all", "Load file", "Save to file", "Quit"};
final int[] fileKeyCodes = {KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_S, KeyEvent.VK_Q};
final ActionListener[] fileActionListeners = {
new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.clearAll();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.loadFile();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.saveToFile();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);}}
final String[] editMenuItems = {"Cut", "Copy", "Paste", "Delete"};
final int[] editKeyCodes = {KeyEvent.VK_X, KeyEvent.VK_C, KeyEvent.VK_V, KeyEvent.VK_BACK_SPACE};
final int[] editMenuMasks = {menuMask, menuMask, menuMask, 0};
final ActionListener[] editActionListeners = {
new ActionListener() {
public void actionPerformed(ActionEvent e) { canvas.cut();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) { canvas.copy();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) { canvas.paste();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) { canvas.delete();}}
final String[] layeringMenuItems = {"Bring to front", "Send to back"};
final int[] layeringKeyCodes = {KeyEvent.VK_F, KeyEvent.VK_B};
final ActionListener[] layeringActionListeners = {
new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.bringToFront();}},
new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.sendToBack();}}
private JavaDraw(){
super("JavaDraw!");
toolbar.setCanvas(canvas);
getContentPane().add(toolbar, BorderLayout.SOUTH);
getContentPane().add(canvas, BorderLayout.CENTER);
createMenus();
setJMenuBar(mb);
setLocation(100, 20);
pack();
setVisible(true);
static public void main(String[] args){
JavaDraw javaDraw = new JavaDraw();
private void initMenus(JMenu m,
String miLabel,
int keyCode,
int menuMask,
ActionListener al){
JMenuItem mi = new JMenuItem(miLabel);
m.add(mi);
mi.addActionListener(al);
mi.setAccelerator(KeyStroke.getKeyStroke(keyCode, menuMask));
private void createMenus(){
JMenu m;
m = new JMenu("File");
for(int i = 0; i < fileMenuItems.length; i++)
initMenus(m,
fileMenuItems,
fileKeyCodes[i],
menuMask,
fileActionListeners[i]);
mb.add(m);
m = new JMenu("Edit");
for(int i = 0; i < editMenuItems.length; i++)
initMenus(m,
editMenuItems[i],
editKeyCodes[i],
editMenuMasks[i],
editActionListeners[i]);
mb.add(m);
m = new JMenu("Layering");
for(int i = 0; i < layeringMenuItems.length; i++)
initMenus(m,
layeringMenuItems[i],
layeringKeyCodes[i],
menuMask,
layeringActionListeners[i]);
mb.add(m);
*-------------------------------------------------------------- 80 columns ---|
* The DrawingCanvas class a small extension of JComponent
* @version 1.1 15/04/01
* @author Julie Zelenski
* @author (touched up by Ian A. Mason)
* @see javax.swing.JComponent
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
public class DrawingCanvas extends JComponent{
static final int DRAG_NONE = 0;
static final int DRAG_CREATE = 1;
static final int DRAG_RESIZE = 2;
static final int DRAG_MOVE = 3;
// list of all shapes on canvas
protected Vector allShapes;
// currently selected shape (can be null at times)
protected Rect selectedShape;
// reference to toolbar to message for tool&color settings
protected Toolbar toolbar;
protected Rect clipboard=null;
/* These are the unimplemented menu commands. The menus are already
* set up to send the correct messages to the canvas, but the
* method bodies themselves are currently completely empty. It will
* be your job to fill them in!
public void cut() {
copy();
delete();
public void copy() {
int x=(int)selectedShape.getBounds().getX();
int y=(int)selectedShape.getBounds().getY();
Point p=new Point(x,y);
clipboard=new Rect(p,this);
clipboard.setBounds(selectedShape.getBounds());
public void paste() {
if(clipboard==null)
return;
allShapes.add(clipboard);
setSelectedShape(clipboard);
copy();
this.repaint();
public void delete() {
if(selectedShape==null)
return;
else{
int num=allShapes.indexOf(selectedShape);
allShapes.remove(num);
selectedShape=null;
this.repaint();
public void clearAll() {
allShapes.removeAllElements();
this.repaint();
public void loadFile() {
Load load=new Load(this);
load.setSize(250,200);
load.validate();
load.setVisible(true);
public void done(Vector vect){
allShapes.removeAllElements();
for(int i=0;i<vect.size();i++){
allShapes.add(vect.elementAt(i));
this.repaint();
public void saveToFile() {
Save save=new Save(allShapes);
save.setSize(250,200);
save.validate();
save.setVisible(true);
public void bringToFront() {
if(selectedShape==null)
return;
int size=allShapes.size();
int index=allShapes.indexOf(selectedShape);
for(int i=index+1;i<=size-1;i++){
allShapes.set(i-1,allShapes.elementAt(i));
allShapes.set(size-1,selectedShape);
this.repaint();
public void sendToBack() {
if(selectedShape==null)
return;
int index=allShapes.indexOf(selectedShape);
for(int i=index-1;i>=0;i--){
allShapes.remove(allShapes.elementAt(i+1));
allShapes.add(i+1,allShapes.elementAt(i));
allShapes.remove(allShapes.elementAt(0));
allShapes.add(0,selectedShape);
this.repaint();
* Constructor for creating a new empty DrawingCanvas. We set up
* our size and background colors, instantiate an empty vector of shapes,
* and install a listener for mouse events using our inner class
* CanvasMouseHandler
public DrawingCanvas(Toolbar tb, int width, int height){
setPreferredSize(new Dimension(width, height));
setBackground(Color.white);
toolbar = tb;
allShapes = new Vector();
selectedShape = null;
CanvasMouseHandler handler = new CanvasMouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
* All components are responsible for drawing themselves in
* response to repaint() requests. The standard method a component
* overrides is paint(Graphics g), but for Swing components, the default
* paint() handler calls paintBorder(), paintComponent() and paintChildren()
* For a Swing component, you override paintComponent and do your
* drawing in that method. For the drawing canvas, we want to
* clear the background, then iterate through our shapes asking each
* to draw. The Graphics object is clipped to the region to update
* and we use to that avoid needlessly redrawing shapes outside the
* update region.
public void paintComponent(Graphics g){
Rectangle regionToRedraw = g.getClipBounds();
g.setColor(getBackground());
g.fillRect(regionToRedraw.x, regionToRedraw.y,
regionToRedraw.width, regionToRedraw.height);
Iterator iter = allShapes.iterator();
while (iter.hasNext())
((Rect)iter.next()).draw(g, regionToRedraw);
* Changes the currently selected shape. There is at most
* one shape selected at a time on the canvas. It is possible
* for the selected shape to be null. Messages the shape to
* change its selected state which will in turn refresh the
* shape with the knobs active.
protected void setSelectedShape(Rect shapeToSelect) {
// if change in selection
if (selectedShape != shapeToSelect) {
// deselect previous selection
if (selectedShape != null)
selectedShape.setSelected(false);
// set selection to new shape
selectedShape = shapeToSelect;
if (selectedShape != null) {
shapeToSelect.setSelected(true);
* A hit-test routine which finds the topmost shape underneath a
* given point.We search Vector of shapes in back-to-front order
* since shapes created later are added to end and drawn last, thus
* appearing to be "on top" of the earlier ones. When a click comes
* in, we want to select the top-most shape.
protected Rect shapeContainingPoint(Point pt){
for (int i = allShapes.size()-1; i >= 0; i--) {
Rect r = (Rect)allShapes.elementAt(i);
if (r.inside(pt)) return r;
return null;
* The inner class CanvasMouseHandler is the object that handles the
* mouse actions (press, drag, release) over the canvas. Since there is
* a bit of state to drag during the various operations (which shape,
* where we started from, etc.) it is convenient to encapsulate all that
* state with this little convenience object and register it as the
* handler for mouse events on the canvas.
protected class CanvasMouseHandler
extends MouseAdapter implements MouseMotionListener {
Point dragAnchor;
// variables using to track state during drag operations
int dragStatus;
/** When the mouse is pressed we need to figure out what
* action to take. If the tool mode is arrow, the click might
* be a select, move or reisze. If the tool mode is one of the
* shapes, the click initiates creation of a new shape.
public void mousePressed(MouseEvent event){
Rect clicked = null;
Point curPt = event.getPoint();
// first, determine if click was on resize knob of selected shape
if (toolbar.getCurrentTool() == Toolbar.SELECT) {
if (selectedShape != null &&
(dragAnchor = selectedShape.getAnchorForResize(curPt))
!= null) {
// drag will resize this shape
dragStatus = DRAG_RESIZE;
} else if ((clicked = shapeContainingPoint(curPt)) != null) {
// if not, check if any shape was clicked
setSelectedShape(clicked);
// drag will move this shape
dragStatus = DRAG_MOVE;
dragAnchor = curPt;
} else {
// else this was a click in empty area,
// deselect selected shape,
setSelectedShape(null);
// drag does nothing in this case
dragStatus = DRAG_NONE;
} else {
Rect newShape = new Rect(curPt, DrawingCanvas.this);
// create rect here
allShapes.add(newShape);
setSelectedShape(newShape);
dragStatus = DRAG_CREATE;
// drag will create (resize) this shape
dragAnchor = curPt;
/** As the mouse is dragged, our listener will receive periodic
* updates as mouseDragged events. When we get an update position,
* we update the move/resize event that is in progress.
public void mouseDragged(MouseEvent event){
Point curPt = event.getPoint();
switch (dragStatus) {
case DRAG_MOVE:
selectedShape.translate(curPt.x - dragAnchor.x,
curPt.y - dragAnchor.y);
// update for next dragged event
dragAnchor = curPt;
break;
case DRAG_CREATE: case DRAG_RESIZE:
selectedShape.resize(dragAnchor, curPt);
break;
public void mouseMoved(MouseEvent e) {}
/** A little helper routine that will be useful for the load & save
* operations. It brings up the standard JFileChooser dialog and
* allows the user to specify a file to open or save. The return
* value is the full path to the chosen file or null if no file was
* selected.
protected String filenameChosenByUser(boolean forOpen){
JFileChooser fc = new JFileChooser(System.getProperty("user.dir") +
java.io.File.separator + "Documents");
int result = (forOpen? (fc.showOpenDialog(this)) :
fc.showSaveDialog(this));
java.io.File chosenFile = fc.getSelectedFile();
if (result == JFileChooser.APPROVE_OPTION && chosenFile != null)
return chosenFile.getPath();
return null;
// return null if no file chosen or dialog cancelled
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.io.*;
class Load extends JFrame implements ActionListener, Serializable{
Container contentPane;
JTextField jtf;
JButton jb;
Object obj=null;
Load load;
Thread thread;
DrawingCanvas draw;
public Load(DrawingCanvas dc){
draw=dc;
contentPane=getContentPane();
contentPane.setLayout(new FlowLayout());
jtf=new JTextField(20);
jb=new JButton("Load");
jb.addActionListener(this);
contentPane.add(jtf);
contentPane.add(jb);
public void actionPerformed(ActionEvent e){
String text=jtf.getText();
SimpleObjectReader reader=SimpleObjectReader.openFileForReading(text+".shp");
if(reader==null){
System.out.println("Couldn't open file!");
return;
obj=reader.readObject();
reader.close();
draw.done((Vector)obj);
this.setVisible(false);
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Vector;
import java.io.*;
class Save extends JFrame implements ActionListener, Serializable{
Container contentPane;
JTextField jtf;
Vector shapes;
JButton jb;
public Save(Vector shapeVector){
shapes=shapeVector;
contentPane=getContentPane();
contentPane.setLayout(new FlowLayout());
jtf=new JTextField(20);
jb=new JButton("Save");
jb.addActionListener(this);
contentPane.add(jtf);
contentPane.add(jb);
public void actionPerformed(ActionEvent e){
String text=jtf.getText();
SimpleObjectWriter writer=SimpleObjectWriter.openFileForWriting(text+".shp");
if(writer==null){
System.out.println("Couldn't open file!");
return;
writer.writeObject(shapes);
writer.close();
this.setVisible(false);
*-------------------------------------------------------------- 80 columns ---|
* The RectShape class defines a simple rectangular shape object.
* It tracks its bounding box, selected state, and the canvas it is being
* drawn in. It has some basic methods to select, move, and resize the
* rectangle. It has methods that draw the shape in the selected or unselected
* states and updates the canvas whenever the state or bounds of the rectangle
* change. The code that is there works properly, but you will need to extend
* and change the code to support additional features.
* @version 1.1 15/04/01
* @author Julie Zelenski
* @author (touched up by Ian A. Mason)
import java.awt.*;
import java.io.*;
public class Rect implements Serializable{
protected Rectangle bounds;
protected boolean isSelected;
public Color color;
public DrawingCanvas canvas;
protected static final int KNOB_SIZE = 6;
protected static final int NONE = -1;
protected static final int NW = 0;
protected static final int SW = 1;
protected static final int SE = 2;
protected static final int NE = 3;
/** The constructor that creates a new zero width and height rectangle
* at the given position in the canvas.
public Rect(Point start, DrawingCanvas dcanvas){
canvas = dcanvas;
bounds = new Rectangle(start);
color=canvas.toolbar.getCurrentColor();
/** The "primitive" for all resizing/moving/creating operations that
* affect the rect bounding box. The current implementation just resets
* the bounds variable and triggers a re-draw of the union of the old &
* new rectangles. This will redraw the shape in new size and place and
* also "erase" if bounds are now smaller than before. It is a good
* design to have all changes to a critical variable bottleneck through
* one method so that you can be sure that all the updating that goes
* with it only needs to be implemented in this one place. If any of your
* subclasses have additional work to do when the bounds change, this is
* the method to override. Make sure that any methods that change the
* bounds call this method instead of directly manipulating the variable.
protected void setBounds(Rectangle newBounds){
Rectangle oldBounds = bounds;
bounds = newBounds;
updateCanvas(oldBounds.union(bounds));
/** The resize operation is called when first creating a rect, as well as
* when later resizing by dragging one of its knobs. The two parameters
* are the points that define the new bounding box. The anchor point
* is the location of the mouse-down event during a creation operation
* or the opposite corner of the knob being dragged during a resize
* operation. The end is the current location of the mouse. If you
* create the smallest rectangle which encloses these two points, you
* will have the new bounding box. Use the setBounds() primitive which
* is the bottleneck we are using for all geometry changes, it handles
* updating and redrawing.
public void resize(Point anchor, Point end){
Rectangle newRect = new Rectangle(anchor);
// creates smallest rectange which
// includes both anchor & end
newRect.add(end);
// reset bounds & redraw affected areas
setBounds(newRect);
public Rectangle getBounds(){
return bounds;
/** The translate operation is called when moving a shape by dragging in
* the canvas. The two parameters are the delta-x and delta-y to move
* by. Note that either or both can be negative. Create a new rectangle
* from our bounds and translate and then go through the setBounds()
* primitive to change it.
public void translate(int dx, int dy){
Rectangle newRect = new Rectangle(bounds);
newRect.translate(dx, dy);
setBounds(newRect);
/** Used to change the selected state of the shape which will require
* updating the affected area of the canvas to add/remove knobs.
public void setSelected(boolean newState){
isSelected = newState;
// need to erase/add knobs
// including extent of extended bounds
updateCanvas(bounds, true);
/** The updateCanvas() methods are used when the state has changed
* in such a way that it needs to be refreshed in the canvas to properly
* reflect the new settings. The shape should take responsibility for
* messaging the canvas to properly update itself. The appropriate AWT/JFC
* way to re-draw a component is to send it the repaint() method with the
* rectangle that needs refreshing. This will cause an update() event to
* be sent to the component which in turn will call paint(), where the
* real drawing implementation goes. See the paint() method in
* DrawingCanvas to see how it is implemented.
protected void updateCanvas(Rectangle areaOfChange, boolean enlargeForKnobs){
Rectangle toRedraw = new Rectangle(areaOfChange);
if (enlargeForKnobs)
toRedraw.grow(KNOB_SIZE/2, KNOB_SIZE/2);
canvas.repaint(toRedraw);
protected void updateCanvas(Rectangle areaOfChange){
updateCanvas(areaOfChange, isSelected);
/** When the DrawingCanvas needs a shape to draw itself, it sends a draw
* message, passing the graphics context and the current region being
* redrawn. If the shape intersects with that region, it must draw itself
* doing whatever it takes to properly represent itself in the canvas
* (colors, location, size, knobs, etc.) by messaging the Graphics object.
public void draw(Graphics g, Rectangle regionToDraw){
if (!bounds.intersects(regionToDraw))
return;
g.setColor(color);
g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
if (isSelected) { // if selected, draw the resizing knobs
// along the 4 corners
Rectangle[] knobs = getKnobRects();
for (int i = 0; i < knobs.length; i++)
g.fillRect(knobs[i].x, knobs[i].y,
knobs[i].width, knobs[i].height);
/** When the DrawingCanvas needs to determine which shape is under
* the mouse, it asks the shape to determine if a point is "inside".
* This method should returns true if the given point is inside the
* region for this shape. For a rectangle, any point within the
* bounding box is inside the shape.
public boolean inside(Point pt){
return bounds.contains(pt);
/** When needed, we create the array of knob rectangles on demand. This
* does mean we create and discard the array and rectangles repeatedly.
* These are small objects, so perhaps it is not a big deal, but
* a valid alternative would be to store the array of knobs as an
* instance variable of the Shape and and update the knobs as the bounds
* change. This means a little more memory overhead for each Shape
* (since it is always storing the knobs, even when not being used) and
* having that redundant data opens up the possibility of bugs from
* getting out of synch (bounds move but knobs didn't, etc.) but you may
* find that a more appealing way to go. Either way is fine with us.
* Note this method provides a nice unified place for one override from
* a shape subclass to substitute fewer or different knobs.
protected Rectangle[] getKnobRects(){
Rectangle[] knobs = new Rectangle[4];
knobs[NW] = new Rectangle(bounds.x - KNOB_SIZE/2,
bounds.y - KNOB_SIZE/2, KNOB_SIZE, KNOB_SIZE);
knobs[SW] = new Rectangle(bounds.x - KNOB_SIZE/2,
bounds.y + bounds.height - KNOB_SIZE/2,
KNOB_SIZE, KNOB_SIZE);
knobs[SE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
bounds.y + bounds.height - KNOB_SIZE/2,
KNOB_SIZE, KNOB_SIZE);
knobs[NE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
bounds.y - KNOB_SIZE/2,
KNOB_SIZE, KNOB_SIZE);
return knobs;
/** Helper method to determine if a point is within one of the resize
* corner knobs. If not selected, we have no resize knobs, so it can't
* have been a click on one. Otherwise, we calculate the knob rects and
* then check whether the point falls in one of them. The return value
* is one of NW, NE, SW, SE constants depending on which knob is found,
* or NONE if the click doesn't fall within any knob.
protected int getKnobContainingPoint(Point pt){
// if we aren't selected, the knobs
// aren't showing and thus there are no knobs to check
if (!isSelected) return NONE;
Rectangle[] knobs = getKnobRects();
for (int i = 0; i < knobs.length; i++)
if (knobs[i].contains(pt))
return i;
return NONE;
/** Method used by DrawingCanvas to determine if a mouse click is starting
* a resize event. In order for it to be a resize, the click must have
* been within one of the knob rects (checked by the helper method
* getKnobContainingPoint) and if so, we return the "anchor" ie the knob
* opposite this corner that will remain fixed as the user drags the
* resizing knob of the other corner around. During the drag actions of a
* resize, that fixed anchor point and the current mouse point will be
* passed to the resize method, which will reset the bounds in response
* to the movement. If the mouseLocation wasn't a click in a knob and
* thus not the beginning of a resize event, null is returned.
public Point getAnchorForResize(Point mouseLocation){
int whichKnob = getKnobContainingPoint(mouseLocation);
// no resize knob is at this location
if (whichKnob == NONE)
return null;
switch (whichKnob) {
case NW: return new Point(bounds.x + bounds.width,
bounds.y + bounds.height);
case NE: return new Point(bounds.x, bounds.y + bounds.height);
case SW: return new Point(bounds.x + bounds.width, bounds.y);
case SE: return new Point(bounds.x, bounds.y);
return null;
import java.io.*;
* SimpleObjectReader is a small class to wrap around the usual ObjectStream
* to shield you from the exception handling which we haven't yet gotten
* to in class.
* <P>It has just three methods of note: one to open a new file for reading,
* one to read an object from an open file, and one to close the file when done.
* <P>Any object that you attempt to read must properly implement the Serializable
* interface. Here is a simple example that shows using the SimpleFileReader to
* to rehydrate objects from a file and print them:
* <PRE>
* SimpleObjectReader reader = SimpleObjectReader.openFileForReading("shapes");
* if (reader == null) {
* System.out.println("Couldn't open file!");
* return;
* Object obj;
* while ((obj = reader.readObject()) != null)
* System.out.println(obj);
* reader.close();
* </PRE>
* <P>You are free to edit or extend this class, but we don't expect that
* you should need to make any changes.
* @version 1.1 15/04/01
* @author Julie Zelenski
* @author (touched up by Ian A. Mason)
public class SimpleObjectReader {
private ObjectInputStream ois;
* Opens a new file for reading. The filename can either be a relative
* path, which will be relative to the working directory of the program
* when started, or an absolute path. If the file exists and can be
* opened, a new SimpleObjectReader is returned. If the file cannot be
* opened (for any reason: wrong name, wrong path, lack of permissions, etc.)
* null is returned.
public static SimpleObjectReader openFileForReading(String filename){
try {
return new SimpleObjectReader(new ObjectInputStream(new FileInputStream(filename)));
} catch(IOException e) {
return null;
* Reads a single object from the file and returns it. If there are
* no more objects in the file (i.e, we have reached the end of file),
* null is returned null is returned. null is also
* returned on any I/O error.
public Object readObject (){
try {
return ois.readObject();
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
* Closes the file when done reading. You should close a reader when
* you are finished to release the OS resources for use by others.
public void close (){
try {
ois.close();
catch (IOException e) {}
* Constructor is private so that only means to create a new reader
* is through the static method which does error checking.
private SimpleObjectReader(ObjectInputStream ois){
this.ois = ois;
import java.io.*;
* SimpleObjectWriter is a small class to wrap around the usual
* ObjectOutputStream to shield you from the exception handling
* which we haven't yet gotten to in class.
* <P>It has just three methods of note: one to open a new file for writing,
* one to write an object to the file, and one to close the
* the file when done.
* <P>Here is a simple example that shows using the SimpleObjectWriter
* to create a new file and write some objects into it:
* <PRE>
* SimpleObjectWriter writer =
* SimpleObjectWriter.openFileForWriting("objects");
* if (writer == null) {
* System.out.println("Couldn't open file!");
* return;
* writer.writeObject("Here is a string");
* writer.writeObject("And another one.");
* writer.writeObject(new Date());
* writer.close();
* </PRE>
* <P>You are free to edit or extend this class, but we don't expect that
* you should need to make any changes.
* @version 1.1 15/04/01
* @author Julie Zelenski
* @author (touched up by Ian A. Mason)
public class SimpleObjectWriter {
private ObjectOutputStream oos;
* Opens a new file for writing. The filename can either be a relative
* path, which will be relative to the working directory of the program
* when started, or an absolute path. If the file can be created, a
* new SimpleObjectWriter is returned. If the file already exists, this
* will overwrite its contentI'm not reading that either, but to help you for next time:
- use more than 1 sentence to describe your problem
- only post the RELEVANT code, or a small test program with the same problem if possible.
At least you formatted it, I'll give you that.
Cheers,
Radish21
PS. I think in this case, posting another (better worded) thread might be a good idea, because no one is going to read this one. In general though, don't :) -
Upload Excel File to SharePoint using VBA
Hi,
I copied and modified the code from a friend which he got it from this website forum.
This apprantely works for some people and not me. Please tell me what I am doing wrong.
Ignore xxxxxx part of the Sharepoint site. Nothing wrong with the site, i tried many combinations, but I get not response, not even an error.
Public Const HR_URL = "http://sun.xxxxxx.com/eng/st/Lists/Database%20Change% 20Request"
Sub test()
'Upload new Excel sheet to SharePoint
Call copyToSharePoint(HR_URL, ThisWorkbook.FullName)
End Sub
'''''''code block from Forum
Public Sub copyToSharePoint(sharepointURL As String, filePath As String)
'On Error GoTo errhandler
'sharePointUrl should not end in a "/"
'Initialize Variables
Dim LlFileLength As Long
Dim Lvarbin() As Byte
Dim LobjXML As Object
Dim LvarBinData As Variant
Dim LstrFileName As String, PstrFullfileName As String, PstrTargetURL As String
Dim fileName As String, lenFileName As Long
'Extract file name
lenFileName = Len(filePath) - InStrRev(filePath, "\")
fileName = Right(filePath, lenFileName)
'Check that the webUrl ends in an "/"
If Right(sharepointURL, 1) <> "/" Then
sharepointURL = sharepointURL & "/"
End If
'**************************** Upload binary files *****************
Set LobjXML = CreateObject("Microsoft.XMLHTTP")
PstrFullfileName = filePath
LlFileLength = FileLen(PstrFullfileName) - 1
' Read the file into a byte array.
ReDim Lvarbin(LlFileLength)
Open PstrFullfileName For Binary As #1
Get #1, , Lvarbin
Close #1
' Convert to variant to PUT.
LvarBinData = Lvarbin
PstrTargetURL = sharepointURL & fileName
' Put the data to the server; false means synchronous.
LobjXML.Open "PUT", PstrTargetURL, False
' Send the file in.
LobjXML.Send LvarBinData
Set LobjXML = Nothing
Exit Sub
errhandler:
If Err.Number = 53 Then
MsgBox "Excel was unable to create the HR file to submit to SharePoint. " & vbNewLine & _
"Please check that you are not running out of disk space and that no MS Office add-in is causing issues with Excel.", vbCritical, "File Error"
Exit Sub
Else
MsgBox "Your HR could not be submitted to SharePoint. The following error occurred:" & vbNewLine & _
"Error " & Err.Number & ": " & Err.Description, vbCritical, "Error Uploading to SharePoint"
Exit Sub
End If
End SubI have made the following code work successfully on a Windows 8 machine with the VBA executing from an Excel 2010 file and the file you want to upload going to a SharePoint 2010 site. If you don't need to use SP content types then simply
take that out of the code. Also, pay attention to the FieldInformation as the Field Display names and Field Internal names can sometimes be different. Cheers.
Public Sub copyDocToSP()
Const strLocalFile = "C:\temp\myLocalFile.pdf"
Const spBASE_URL = "https://thesharepointdomian/sites/yoursite/"
Const spDOC_LIB = "Your SP Doc Library Name"
Const spFILE_NAME = "FileNameOnceOnSharepoint.pdf"
Const spCONTENT_TYPE = "0x000000000000000000000000000000000000000"
Set ObjectStream = CreateObject("ADODB.Stream")
Set ObjectDOM = CreateObject("Microsoft.XMLDOM")
Set ObjectElement = ObjectDOM.createElement("TMP")
Set ObjectHTTP = CreateObject("Microsoft.XMLHTTP")
'Reading binary file
ObjectStream.Open
ObjectStream.Type = 1 'Type Binary
ObjectStream.LoadFromFile (strLocalFile)
BinaryFile = ObjectStream.Read()
ObjectStream.Close
'Conversion Base64
ObjectElement.DataType = "bin.base64" 'Type Base64
ObjectElement.nodeTypedValue = BinaryFile
EncodedFile = ObjectElement.Text
'Build request to load document
strURLService = spBASE_URL + "_vti_bin/copy.asmx"
strSOAPAction = "http://schemas.microsoft.com/sharepoint/soap/CopyIntoItems"
strSOAPCommand = "<?xml version='1.0' encoding='utf-8'?>" & _
"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" & _
"<soap:Body>" & _
"<CopyIntoItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>" & _
"<SourceUrl>" + strLocalFile + "</SourceUrl>" & _
"<DestinationUrls>" & _
"<string>" + spBASE_URL + spDOC_LIB + "/" + spFILE_NAME + "</string>" & _
"</DestinationUrls>" & _
"<Fields>" & _
"<FieldInformation Type='Text' InternalName='Title' DisplayName='Title' Value='this is the title value' />" & _
"<FieldInformation Type='Choice' InternalName='Our_x0020_Status' DisplayName='Our Document Status' Value='Ready-to-distribute' />" & _
"<FieldInformation Type='Text' InternalName='ContentTypeId' DisplayName='Content Type ID' Value='" + spCONTENT_TYPE + "' />" & _
"</Fields>" & _
"<Stream>" + EncodedFile + "</Stream>" & _
"</CopyIntoItems>" & _
"</soap:Body>" & _
"</soap:Envelope>"
ObjectHTTP.Open "Get", strURLService, False
ObjectHTTP.SetRequestHeader "Content-Type", "text/xml; charset=utf-8"
ObjectHTTP.SetRequestHeader "SOAPAction", strSOAPAction
ObjectHTTP.Send strSOAPCommand
MsgBox (ObjectHTTP.responseText)
End Sub -
How do I establish a connection to another Java program on the net?
Hi all,
I have been reading the java tutorial to find a solution to my problem but I havent really found what Im looking for.
I want to establish a connection that allows a client to get a copy of an object from a running java-application on a server on the internet.
I have read about the Socket-class but the tutoral advices only to use it on a locale network. I know IDL and RMI only by name - is this what I should be reading about?
If one of you guys have a source-code example on how to make java programs communicate over the net, please post it!
Regards AlbertAssuming this is "wide area" stuff, not just on a local area network, your best bet is to stick to http connections. You need a web server, probably Tomcat.
Your client can connect using URL.openConnection().
As to protocols you could use SOAP. It has the advantage that you can get the code for it for free, but it can be pretty complicated to configure. In particular it only knows how to transmit a limited set of object types and if you want to go beyond them you have to write converters. SOAP servers typically run under an web server anyway. SOAP converts all the data to XML for transmission.
However it may be simpler to use Java's built in serialisation facility and send your data as an ObjectStream.
In the set up you're talking about the message going to the server seems a lot simpler than the response. It may make sense to send your data as normal keyword parameters of a POST transaction but to have the server respond with an Object stream. That's well within the normal operation of a web server. -
Writing files to disk.....
Hi, any ideas why this code to read in an array of bytes (a file) from a server and then write the file to a user chosen directory does not work??
Should I be using a fileObject and not just a fileoutputstream?? I am using an example from a book that just reads in the array of bytes, creates a fileoutputstream and uses its write method to save the file....
Any ideas??
Thanks!
byte[] theDocument = (byte[])objectIn.readObject();
if (theDocument.length > 0)
//Let user choose where to put this file
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setApproveButtonText("Save");
fileChooser.setApproveButtonToolTipText("Click to save the document in this directory");
selection = fileChooser.showOpenDialog(null);
if (selection == JFileChooser.APPROVE_OPTION)
//Get the address to the folder they chose
String thePath = fileChooser.getSelectedFile().toString();
thePath = thePath + fileName; //FILENAME CREATED & INITIALISED ELSEWHERE AND IS ALWAYS SOMETHING LIKE MYFILE.TXT FILE NAME MAY HAVE SPACES SOMETIMES, PROBLEM???
//now write the file out to the folder chosen by the user
try
FileOutputStream fileOut = new FileOutputStream(thePath);
fileOut.write(theDocument);//Write the array of bytes to disk to save the file! fileOut.close(); System.out.println("We saved the file to disk!"); //THIS IS DISPLAYED WHEN CODE IS RUN!!
catch (FileNotFoundException FNF)
clientLogin.showUserMessage("Could not save the document. Check that you have permission to write to the chosen destination directory.");
else
clientLogin.showUserMessage("No document was sent back from the server.");
}Yes, I am using a serialised byte array to send the file accross the network from server to client. It just seemed a neat way to do it.....
All communication between my server and client is done using objectoutput and objetcinputstreams because i had problems using printwriters, buffered readers and objectstreams on the same socket....
my server has to receive, populate and send back custom user objects so it made sense (to me anyway) to send all communication like that.....
Is there a better way?
Thanks for speedy replies. -
URGENT -java MAil sending pdf as attachment
I have a small java program that sends the pdf as an attachment without using phisical pdf file.
but the problem is i am unable to open the pdf that comes as as attachment in mail.
error while opening pdf : " acrobat cannot open file bcos the file type is not supported or the file is curropted(for example it was sent as email attachment and was not properly decoded)"
here is the code :
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
import java.util.*;
public class Mailer {
public static void main (String args[]) {
String host = "abc";
String from ="[email protected]";
String to = "[email protected]";
//String fileAttachment = args[0];
// Get system properties
Properties props = System.getProperties();
// Setup mail server
props.put("mail.smtp.host", host);
// Get session
Session session =
Session.getInstance(props, null);
// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom( new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Hello JavaMail Attachment subject");
// create the message part
MimeBodyPart messageBodyPart = new MimeBodyPart();
//fill message
messageBodyPart.setText("Hi hello this is the msg in mail");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
String data_to_send = "This msg is sent as an attachment with out using physical file";
String att_type = "application/pdf";
messageBodyPart.setText(data_to_send);
messageBodyPart.setHeader("Content-Type", att_type);
messageBodyPart.setHeader("Content-Transfer-Encoding", "BASE64");
messageBodyPart.setFileName("attachment.pdf");
/* ByteArrayOutputStream byteStream=new ByteArrayOutputStream();
ObjectOutputStream objectStream=new ObjectOutputStream(byteStream);
objectStream.writeObject(data_to_send);
messageBodyPart.setDataHandler(new DataHandler( new ByteArrayDataSource( byteStream.toByteArray(), "application/pdf" )));
messageBodyPart.setFileName("attachment.pdf");
multipart.addBodyPart(messageBodyPart);
// Put parts in message
message.setContent(multipart);
// Send the message
Transport.send( message );
System.out.println("sent msg");
Thanks
SmiIt's "corrupted" because you are sending a text string and not a PDF document.
And that commented-out code that uses an ObjectOutputStream would have corrupted a PDF document anyway, if you had one.
I suggest if this problem is urgent then you hire professional programming help to get it done. You are a long way from a solution. -
Hi
I am having problems implementing CipherStreams. While encrypting objects with the Cipher-Class works perfectly fine, wrapping CipherStreams around ObjectStreams, or ObjectStreams around CipherStreams wont work. While i first tried to use the following:
inputstream
cipherinputstream(inputstream)
objectinputstream(cipherinputstream)
i tried to switch the cipher- and objectinputstream initialization, which in the end didnt change anything. What happens is:
Both ways compile ( NetBeans 3.5 ), but in both cases the program stops executing when trying to wrap a cipherstream around an inputstream or an objectinputstream ( same goes for outputstreams of course ).
No exception is being thrown, the program just stops.
Any suggestions? :)Ah, thx for your answer. While in my working code, i first created the OutputStream, and then the InputStream, i switched the order when implementing the CipherStreams. I am going to test it now, i guess though, that was the problem.
thx again, if this doesnt solve the problem, be sure to read again from me ;)
thx, Ben -
Hi, I am trying to write a simple file using an objectStream. When I write the file, it add
this to the begining of the file:
\254\355^Et^E
and when I try to write one or more things, it puts this inbetween them:
t^G
Does anyone know what is going on? I think that it might have something to do with the platform
that I am running on because the first message is different in a different OS.
Please help.
Remember: There are two ways to tell a sexy man. The first is he forgets things easily, the second,
I forget.Never mind. I found some help from another part of the forum. But I might have another
question in a little bit about how to read an enumeration if anyone might be able to
help with.
Thanks -
this code works, however i am not sure how/why?
i am interested in how Strings/characters are sent over tcp
streams:
here is sender:
Socket sok = new Socket(server, port);
OutputStreamWriter streamWriter = new OutputStreamWriter(sok.getOutputStream());
streamWriter.write(xmlString, 0, xmlString.length());i am ok with this.
i see that the OutputStreamWriter does "something" about converting the
socket's OutputStream to characters.
here is receiver:
SAXParser parser = saxFactory.newSAXParser();
Socket sok = serverSok.accept();
parser.parse(sok.getInputStream(), new MyHandler());see, i am plugging:
sok.getInputStream()
directly into the sax parser without providing context
that those bytes are characters (and what character encodings ).
so, what is going on? i might imagine using:
ObjectOutputStream.appendClass();
ObjectInputStream.resolveClass();to provide context that the byte stream are
characters of the "x" character set.
however, i am not using any
ObjectStreams.
if this is a ridiculous question, and the answer is
in the api somehow, i am sorry. i am not good
at always understanding the api.then my fundamental confusion is the difference between
java.io.Reader;
java.io.InputStream;
consider the set of polymorphic method signatures for the
SAXParser parse () methods.
parser.parse(sok.getInputStream(), new MyHandler());clearly invokes:
public void parse(InputStream is, DefaultHandler dh);however i don't see any method signature that matches:
parser.parse(new InputStreamReader(sok.getInputStream(), myCharSet), new MyHandler());for example, in the api, there is no:
public void parse(Reader r, DefaultHandler dh);this has been very helpful.
i will Google the interchangability of Reader/InputStream tomorrow, however any
further guidance would be welcomed. the java.io heirarchy confuses me. -
Serializing objects with the NIO API
I try to use the new IO API to implement a non-blocking multi-threaded server that communicates with client applications by exchanging serialized objects. I started from the code in the JavaWorld article at http://www.javaworld.com/javaworld/jw-09-2001/jw-0907-merlin.html .
With the new features of J2SDK 1.4.0, you don't have to create a separate thread per connected client. That is a big improvement.
But when I read an object with ObjectInputStream, I get a java.nio.channels.IllegalBlockingModeException.
Has anybody successfully implemented such a server since the release of the new io API?
Thanks.
Jean-RobertThe ObjectStream code is basically incompatible with non blockin I/O since you must block on the stream until a whole Object is available. You could roll something like this yourself, by reading bytes until there are enough available to build the next object and then getting that Object from the buffer and shipping it to your client thread. All of this is far more trouble than just using the Stream oriented I/O.
NIO and mutilple threads are a nightmare, the whole idea of non-blocking I/O is to avoid needing multiple threads. If you do use multiple threads you will need queues between them. See the Taming the NIO Circus topic for lots of discussion of NIO and its problems. The system seems more stable in JDK 1.5, but most people haven't even started using 1.4 for production yet.
Personally I avoid ObjectStreams. They are only useful between Java applications, if I want that I just use RMI and let Java do ALL the hard work. When I write a Socket based app, its probably because the other end is a mainframe of a C program. For that reason I send data as bytes, packaged up in packets, and encode as XML or ASN.1 so the other end can interpret it.
Maybe you are looking for
-
I had cancelled a auto withdrawal from a app I purchased months ago. The app is smule sing. I cancelled the VIP on December 26,2013. Auto renewal was on 12/27/2013. On 1/7/2014 apple charged my account for this. How do I get my money back
-
Validation of an XML document using an XMLSchema !
Hi all, i have an xml document and an XmlSchema. Well, my mission is validate the xml document using the XmlSchema and give the message true or false to the user. What is the best,easier and faster way to do this ? Cheers. Stefano
-
Web sharing will not start OS X Lion
Hi there, I am new to all this so I have probably made some simple errors and I hope someone can help me. I will retell what I have done as I haven't a clue what part of what I have done has mucked things up. I am really stuck. Web sharing will not s
-
Firefox os x 20 tries to restore session at every start up
Im using firefox 20 beta and os x 10.8.2, Ive been on beta channel for a long time but with 20 beta every time I start firefox it says "well this is embrassing..." and tries to restore couple of tabs I visited before..problem just started after first
-
Is anyone else's computer running very slow after upgrading to Lion?
I just upgraded to Lion-- had no problems with speed before, now websites take forever to load-- anyone else encounter this?? Any fixes??