views:

197

answers:

4

Hi,

I'd like to write some messages to the server. Each time, for the tramsmitting only, I'm closing the outputStream and reopen it when I have to send the next message.

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();

How Can I keep this Socket's OutputStream, os, open and still be able to send the message?

Thanks.

A: 

Wrap the Socket's OutputStream in a PrintWriter and call the PrintWriter's println method.

PrintWriter pw = new PrintWriter(socket.getOutputStream());
....
pw.println(message); // call repeatedly to send messages.
....
pw.close(); // when finished writing to server and want to close conn.
Finbarr
A: 

I am missing something here. If you don't call close, it will not close. For example,

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
// Do something 
os.write("more message");
os.flush();
// When you are finally done
os.close();
ZZ Coder
+1  A: 

In most protocols, the server accepts som kind of EOF symbol. Send such a symbol instead of closing the stream.

For example, IRC servers interpret "\r\n" as the end of a message. This would be 2 messages on one open OutputStream:

PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.print("JOIN #channel1\r\n");
printStream.flush( );
printStream.print("JOIN #channel2\r\n");
printStream.flush( );

Also, you should wrap your outputStream with DataOutputStream. This wrapper creates more portable output. Plain OutputStream can cause trouble with certain primitive datatypes if server and client have different computer architectures.

deadsven
A: 

I have found the problem and it lays on the client's side. On the client, I have used -

count = inputStream.read(buffer)) > -1

That means, the client waits till server's outputStream closed, and then processing the incoming data.

Eyal