Java-клиент в сокете

Я так долго искал способ подключиться к серверу, созданному на 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, чтобы сузить проблему? Я бы запустил пример сервера, найденный здесь без эхо-компонента. Также возможно, что ваш брандмауэр блокирует соединения. Если вместо этого вы привязываетесь к локальному хосту, они обычно позволяют работать соединениям.

Deadron 09.12.2020 20:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эхо-сервер 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); ``` ?

Ziv Sion 09.12.2020 20:43

Какую ошибку вы получаете @ZivSion? Вы должны убедиться, что у вас есть import java.net.Socket;

stdunbar 09.12.2020 20:44

У меня есть. Насчет ошибки не знаю. Он показывает ошибку в работе

Ziv Sion 09.12.2020 20:46

Возможно, лучше будет новый пост. Убедитесь, что вы перехватываете все исключения из кода сокета, чтобы облегчить отладку. Дайте мне знать, если вы откроете новый пост.

stdunbar 09.12.2020 20:49

Хорошо, я скажу вам через 5 минут

Ziv Sion 09.12.2020 20:52

Мой новый пост stackoverflow.com/questions/65236804/…

Ziv Sion 10.12.2020 16:37

Другие вопросы по теме