Я так долго искал способ подключиться к серверу, созданному на Python, с помощью java.
Может ли кто-нибудь показать мне, как подключиться к Java и как отправить строку? Рекомендуется, чтобы он также работал на Android
Мой сервер на питоне:
import socket, time
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(("160.07.08.49", 6784))
soc.listen(5)
(client, (ipNum, portNum)) = soc.accept()
while True:
print(client.recv(1024))
time.sleep(0.5)
Мой клиент на Java:
try {
Socket socket = new Socket("160.07.08.49", 6784);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("Hello from java");
printWriter.flush();
printWriter.close();
}catch (Exception e) {e.printStackTrace();}
И я получил ошибку от python, когда клиент Java подключился
print(soc.recv(20))
A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
Эхо-сервер Python:
import socket
HOST = 'localhost'
PORT = 6784
while True:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
Java-клиент:
import java.io.*;
import java.net.Socket;
public class JavaClient {
public static void main(String [] args) {
String serverName = "localhost";
int port = 6784;
try {
Socket client = new Socket(serverName, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Большая разница в том, что я делаю от localhost
до localhost
. Если вам нужно, чтобы сервер Python был доступен за пределами локального хоста, измените строку bind
на:
soc.bind(("0.0.0.0", 6784))
чтобы сервер прослушивал все доступные интерфейсы. Затем ваш Java-клиент подключится к внешнему IP-адресу вашего сервера.
Почему в android я получаю ошибку в строке ```Socket client = new Socket("10.0.0.4", 7106); ``` ?
Какую ошибку вы получаете @ZivSion? Вы должны убедиться, что у вас есть import java.net.Socket;
У меня есть. Насчет ошибки не знаю. Он показывает ошибку в работе
Возможно, лучше будет новый пост. Убедитесь, что вы перехватываете все исключения из кода сокета, чтобы облегчить отладку. Дайте мне знать, если вы откроете новый пост.
Хорошо, я скажу вам через 5 минут
Мой новый пост stackoverflow.com/questions/65236804/…
Вы пытались использовать примеры, предоставленные Python, чтобы сузить проблему? Я бы запустил пример сервера, найденный здесь без эхо-компонента. Также возможно, что ваш брандмауэр блокирует соединения. Если вместо этого вы привязываетесь к локальному хосту, они обычно позволяют работать соединениям.