Сокеты клиент / сервер Java TCP - PullRequest
0 голосов
/ 29 мая 2019

Я работаю над проблемой, которая создаст TCP-сервер и клиента с использованием сокетов.Для клиентского кода моя цель состоит в том, чтобы неоднократно предлагать пользователю ввести предложение S, отправить предложение S на сервер, получить ответ от сервера и отобразить полученное сообщение и время прохождения туда и обратно, выраженное в миллисекундах.На сервере моя цель - создать сокет TCP-сервера, дождаться подключения клиента, получить сообщение, отобразить его с IP-адресом и номером порта клиента, использовать заглавные буквы, отобразить сообщение и вывести ответсообщение с заглавной буквы.

Я пытаюсь использовать некоторое время (! (input.equals ("done") {... сделать что-то}, однако все, что я делаю, застревает в бесконечном цикле.Я надеюсь, что это что-то простое, я просто пропускаю, но я не вижу этого.

TCPServer.java

import java.net.*;
import java.io.*;

public class myFirstTCPServer {
    public static void main(String[] args) throws IOException {

        int servPort = 4999;
        ServerSocket Sy = new ServerSocket(servPort);
        Socket servSocket = Sy.accept();

        InputStreamReader in = new InputStreamReader(servSocket.getInputStream());
        BufferedReader bf = new BufferedReader(in);
        String str = bf.readLine();

        while (!(str.equals("done"))){

            System.out.println("client connected");


            InetAddress address = InetAddress.getLocalHost();
            String ip = address.getHostAddress();
            System.out.println("IP: " + ip);
            System.out.println("Port: " + servPort);

            System.out.println("Message from client: " + str.toUpperCase());

            PrintWriter pr = new PrintWriter(servSocket.getOutputStream());
            pr.println(str);
            pr.flush();
        }
        servSocket.close();
    }
}

TCPClient.java

import java.net.*;
import java.io.*;
import java.util.Scanner;

public class myFirstTCPClient {
    public static void main(String[] args) throws IOException {
        String S;
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a sentence");
        S = input.nextLine();
        Socket clntSocket = new Socket(InetAddress.getLocalHost(), 4999);

        while (!(S.equals("done"))){
            double sent = System.nanoTime();
            PrintWriter pr = new PrintWriter(clntSocket.getOutputStream());
            pr.println(S);
            pr.flush();

            InputStreamReader in = new InputStreamReader(clntSocket.getInputStream());
            BufferedReader bf = new BufferedReader(in);

            String str = bf.readLine();
            System.out.println("Message from server: " + str);
            double received = System.nanoTime();
            double total = received - sent;
            System.out.println("Round Trip Time: " + (total/1000000.0));
        }
        clntSocket.close();
    }
}

1 Ответ

0 голосов
/ 29 мая 2019

вам нужно переместить читателя в цикл while. Потому что именно здесь сервер ожидает чтения данных от клиентов.

    public class myFirstTCPServer {
    public static void main(String[] args) throws IOException {

        int servPort = 4999;
        ServerSocket Sy = new ServerSocket(servPort);
        Socket servSocket = Sy.accept();
        System.out.println("client connected");

        InputStreamReader in = new InputStreamReader(servSocket.getInputStream());
        BufferedReader bf = new BufferedReader(in);

        String str ="";
        while (true)){

            str = bf.readLine();

            if(str.equals("done")) break;

            InetAddress address = servSocket.getInetAddress();
            String ip = address.getHostAddress();
            System.out.println("IP: " + ip);
            System.out.println("Port: " + servPort);

            System.out.println("Message from client: " + str);

            PrintWriter pr = new PrintWriter(servSocket.getOutputStream());
            pr.println(str.toUpperCase());
            pr.flush();
        }
        servSocket.close();
    }
    }  

А затем измените сторону клиента:

public class myFirstTCPClient {
    public static void main(String[] args) throws IOException {
        String S="";
        Scanner input = new Scanner(System.in);

        // you need to provide your server ip/domain
        // InetAddress.getLocalHost() , still works but only works when 
        // your client is in the same machine. 
        Socket clntSocket = new Socket("127.0.0.1", 4999);

        while (!(S.equals("done"))){
            System.out.println("Enter a sentence");
            S = input.nextLine();
            double sent = System.nanoTime();
            PrintWriter pr = new PrintWriter(clntSocket.getOutputStream());
            pr.println(S);
            pr.flush();

            InputStreamReader in = new InputStreamReader(clntSocket.getInputStream());
            BufferedReader bf = new BufferedReader(in);

            String str = bf.readLine();
            System.out.println("Message from server: " + str);
            double received = System.nanoTime();
            double total = received - sent;
            System.out.println("Round Trip Time: " + (total/1000000.0));
        }
        clntSocket.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...