[ Connecting Python and Java via sockets ]
I was trying to implement a simple server program in python and client program in java.
Python server runs well. And Java client compiles good. But cannot connect to Python server.
This is my server.py
import sys
import socket
HOST = ""
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Socket created")
try:
s.bind((HOST, PORT))
except Socket.error as msg:
print("Bind failed.")
print("Error code: "+str(msg[0]))
print("Message: "+str(msg[1]))
sys.exit()
print("Socket bind complete")
s.listen(10)
print("Socket now listening")
while 1:
conn, addr = s.accept()
print("Connected with: "+addr[0])
print(str(addr[1]))
s.close()
And this is my Client.java
file:
import java.net.Socket;
import java.io.IOException;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888);
System.out.println("Connected");
socket.close();
System.out.println("Socket closed");
} catch(IOException exception) {
exception.printStackTrace();
}
}
}
Python server listens to Port 8888. But Java client cannot connect.
This is the output when I run Client
:
java Client
And the output:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at Client.connect(Client.java:84)
at Client.<init>(Client.java:65)
at Client.main(Client.java:301)
Error connecting to localhost at 5555
Why can't it connect? When I write an equivalent Java server program
, it works fine.
This is my Java server: Server.java
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.IOException;
public class ChatServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept();
InetAddress ip = socket.getInetAddress();
System.out.println("Client connected: "+ip.getHostAddress());
socket.close();
} catch(IOException exception) {
exception.printStackTrace();
}
}
}
So my question is short:
Why is Client.java
connected to Server.java
but not Server.py
?
Any help would be appreciated. Thankyou.
Answer 1
Seems like you never cleanly close the socket in your Python code, so it could still be stuck from a previous run attempt? Also, your python program currently doesn't do anything with the connection once received, just keeps trying to accept.
Try something like this:
while(1):
conn, addr = s.accept()
print("Connected with: "+addr[0])
#Waits for any incoming data and echoes it back
while(1):
data = conn.recv(1024)
#break if not found to get to close statement which was never reached in old code
if not data: break
print("Received data:", data.decode())
conn.sendall(data)
conn.close()
Answer 2
I use the exact Python code and Java code you post, it seems work fine, may be something wrong with your environment? you can diagnosis the problem with following steps(assume you run your program in a linux box like me):
1.just run the python server script
./server.py
2.use netcat to see if the server is good for connect
nc -zv localhost 8888
if things goes well, you may see connect established as expected. if not working, use netcat to build a tcp server listen on port 8888
nc -l -p 8888
and connect to it with your java program.
you can also use netstat
to distinguish if server.py works fine
sudo netstat -ntlp | grep :8888
Answer 3
I think I can solve your problem, but I do not know why. You can have a try by adding an item on firewall config with
-A INPUT -i lo -j ACCEPT
then, restart your iptables service.