Почему мой клиент не отправляет данные на сервер через сокеты при повторном запуске программы? - PullRequest
0 голосов
/ 30 апреля 2020

Я отправляю сообщение из программы python в программу Java с использованием сокетов. При первом запуске программы сообщение принимается сервером, но при повторном запуске клиента (без повторного запуска сервера) сообщение не отправляется, и сервер получает нулевое значение. Пожалуйста, помогите?

python клиент:

import socket

HOST = "localhost"
PORT = 8080

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect((HOST, PORT))

#sock.sendall(b'\x00\x0dHello, world!\n')
sock.send(bytes("welcome hi\n","utf8"))

data = sock.recv(1024)
print(data.decode("utf-8"))


if data == (bytes("olleH\n","utf-8")):
    sock.send(bytes("Bye\n","utf8"))
    data = sock.recv(1024)
    print(data.decode("utf-8"))
   }
  }
}

Java сервер


import java.net.*;
import java.util.ArrayList;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Javaserver {
    private static ArrayList<ClientHandler> clients = new ArrayList<>();
    private static ExecutorService pool = Executors.newFixedThreadPool(2);
    private static final int PORT = 8080;
    private ServerSocket server= null;





    public static void main(String args[]) throws Exception {

        System.out.println("wait for connection on port 8080");
        ServerSocket server = new ServerSocket(PORT);
        Socket client = server.accept();

        while (true) {




            System.out.println("got connection on port 8080");
            ClientHandler clientThread = new ClientHandler(client);
            clients.add(clientThread);
            pool.execute(clientThread);

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import java.net.Socket;

public class ClientHandler implements Runnable {
    private Socket client;
    private BufferedReader in;
    private PrintWriter out;
    private String fromClient;
    private String toClient;
    private int id;






    public ClientHandler(Socket client) throws IOException {
        this.client = client;

        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out = new PrintWriter(client.getOutputStream(), true);


    }

    @Override
    public void run() {
        boolean run = true;
        try {
            while (run) {




                fromClient = in.readLine();
                System.out.println("received: " + fromClient );


                if (fromClient.equals("welcome hi")) {
                    toClient = "olleH";
                    System.out.println("send olleH");
                    out.println(toClient);
                    fromClient = in.readLine();
                    System.out.println("received: " + fromClient);

                }
                if(fromClient.equals("ho")){
                    toClient = "olleH";
                    System.out.println("send olleH");
                    out.println(toClient);
                    fromClient = in.readLine();
                    System.out.println("received: " + fromClient);


                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            out.close();
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Для прослушивания новых соединений сокетов вы должны использовать:

ServerSocket server = new ServerSocket(PORT);
Socket client = server.accept();

Вы используете это в своем основном методе вне любого вида l oop, поэтому, если клиент закрывает соединение, сервер не будет прослушивайте новые соединения, если только вы не запустите эту часть кода (поэтому сервер должен быть перезапущен).

Если вы не хотите перезапускать сервер, вы можете создать метод, который прослушивает новый сокет, а затем вызывайте его, если клиент закрывает текущее соединение с сокетом.

public Socket waitForClient(ServerSocket server) {
    return server.accept();
}

Чтобы проверить, был ли сокет закрыт, вы можете использовать read() == -1 или readLine == null, если клиент закрыл сокет с помощью метода close () , Если нет, вы также можете определить, закрыто ли оно, поймав IOException. См. этот пост для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...