read/write to java socket in python

M

madsornomads

Hi all,

I have a problem with reading from a Java server after I have written
to it - it just hangs. It works fine if I just write to the server and
not try to write. I have read the HOWTO on sockets - and it states
that there is a problem (something about flushing), but not what the
solutions is. Nor do google. Can somebody please help?

A few lines down you can see the example code that sums up the
problem. Just change the name of the Python HOST-variable.

Thanks
Mads


This is the client in Python:
#! /usr/bin/env python

import sys
from socket import *

PORT = 3122
HOST = 'app-5'
SUCCESS = 'Success'
FAILURE = 'Failure'

s = socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
s.send("Hi Java Server");
print "Have written, waiting to recieve.."
print s.recv(1014)
s.close()

And this the server in Java:
import java.io.*;
import java.net.*;

public class Server{
public static void main(String args[]){

int port = 3122;
int backLog = 50;

ServerSocket ss = null;
try{

InetAddress localhost =
InetAddress.getLocalHost();
ss = new ServerSocket(port, backLog,
localhost);
while(true){
final Socket client = ss.accept();
new Thread(){
public void run(){
try{


InputStream is =
client.getInputStream();
BufferedReader buf =
new BufferedReader(new InputStreamReader(is));
print(buf.readLine());

PrintWriter out = new
PrintWriter(client.getOutputStream());
out.write("Hi Python
Client.");
out.flush();
client.close();
}catch(Exception e)
{print(e);}
}
}.start();
}
}catch(Exception e){print(e);}
}

private static void print(Object o){System.out.println(o);}
}
 
H

hdante

Hi all,

I have a problem with reading from a Java server after I have written
to it - it just hangs. It works fine if I just write to the server and
not try to write. I have read the HOWTO on sockets - and it states
that there is a problem (something about flushing), but not what the
solutions is. Nor do google. Can somebody please help?

A few lines down you can see the example code that sums up the
problem. Just change the name of the Python HOST-variable.

Thanks
Mads

This is the client in Python:
#! /usr/bin/env python

import sys
from socket import *

PORT = 3122
HOST = 'app-5'
SUCCESS = 'Success'
FAILURE = 'Failure'

s = socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
s.send("Hi Java Server");
print "Have written, waiting to recieve.."
print s.recv(1014)
s.close()

And this the server in Java:
import java.io.*;
import java.net.*;

public class Server{
public static void main(String args[]){

int port = 3122;
int backLog = 50;

ServerSocket ss = null;
try{

InetAddress localhost =
InetAddress.getLocalHost();
ss = new ServerSocket(port, backLog,
localhost);
while(true){
final Socket client = ss.accept();
new Thread(){
public void run(){
try{

InputStream is =
client.getInputStream();
BufferedReader buf =
new BufferedReader(new InputStreamReader(is));
print(buf.readLine());

PrintWriter out = new
PrintWriter(client.getOutputStream());
out.write("Hi Python
Client.");
out.flush();
client.close();
}catch(Exception e)
{print(e);}
}
}.start();
}
}catch(Exception e){print(e);}
}

private static void print(Object o){System.out.println(o);}

}

I don't know, but it's amazing to compare the python client with the
java server.
 
M

madsornomads

I have a problem with reading from a Java server after I have written
to it - it just hangs. It works fine if I just write to the server and
not try to write. I have read the HOWTO on sockets - and it states
that there is a problem (something about flushing), but not what the
solutions is. Nor do google. Can somebody please help?
A few lines down you can see the example code that sums up the
problem. Just change the name of the Python HOST-variable.

This is the client in Python:
#! /usr/bin/env python
import sys
from socket import *

[Snip - a little Python]
And this the server in Java:
import java.io.*;
import java.net.*;

[Snip - a lot of Java]

I don't know, but it's amazing to compare the python client with the
java server.


Yes, Python is really handy :)

/Mads
 
B

Bjoern Schliessmann

I have a problem with reading from a Java server after I have
written to it - it just hangs. It works fine if I just write to
the server and not try to write.

Excuse me?
I have read the HOWTO on sockets - and it states that there is a
problem (something about flushing), but not what the solutions is.
Nor do google. Can somebody please help?

Spare yourself the trouble and do not use low level socket functions
in Python directly. Try Twisted.

http://twistedmatrix.com/projects/core/documentation/howto/clients.html

As for that Java problem I recommend learning common debugging
techniques: Use a protocol analyser (www.wireshark.org) and let
your program(s) output a debug log.

Regards,


Björn
 
D

Dave Baum

Your server program is using readLine(), which will block until a
newline is received. The server code does not write a newline, so it is
waiting at recv() for data from the server, and the server is still
waiting for a newline. If you change the client to do the following, it
should work:

s.send("Hi Java Server\n");


Dave
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,736
Latest member
zacharyharris

Latest Threads

Top