Моя серверная программа не может отправить данные клиентской программе, которую я написал - PullRequest
0 голосов
/ 10 июля 2019

Итак, серверная программа состоит из следующего кода:

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

public class TimeServer {

    public static void main(String[] args) {

        try {

            //Create sockets
            ServerSocket ss = new ServerSocket(60000);
            Socket rs = ss.accept();
            //create streams
            BufferedInputStream bs = new BufferedInputStream(rs.getInputStream());
            InputStreamReader isr = new InputStreamReader(bs);
            BufferedOutputStream bos = new BufferedOutputStream(rs.getOutputStream());
            PrintWriter pw = new PrintWriter(bos);
            //set timeout
            rs.setSoTimeout(20000);
            int c = 0;
            StringBuilder sb = new StringBuilder();
            //while loop reads in a character until a period (includes period)  
            while (((char) c != '.')) {
                c = isr.read();
                //append each char to a string builder
                sb.append((char) c);
            }
            //convert stringbuilder to string
            String str = sb.substring(0);
            //If string equals "time." returns time else error message
            if (str.compareTo("time.") == 0) {
                Date now = new Date();
                pw.print("time is: " + now.toString());
                pw.flush();
            }
            else {
                pw.print("Invalid syntax: connection closed");
                pw.flush();
            }
            //close socket
            rs.close();
            //close serversocket
            ss.close();
        } catch(IOException i) {
            System.out.println(i.getMessage());
        }
    }
}

Код для клиента:

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

public class TimeClient {

    public static void main(String[] args) {

        try {
            //create socket
            Socket sock = new Socket("localhost", 60000);
            //create streams
            BufferedInputStream bis = new BufferedInputStream(sock.getInputStream());
            InputStreamReader isr = new InputStreamReader(bis);
            BufferedOutputStream bos = new BufferedOutputStream(sock.getOutputStream());
            PrintWriter pw = new PrintWriter(bos);
            //set timeout
            sock.setSoTimeout(20000);
            //write argument to stream, argument should be "time." to recieve time
            pw.write(args[0]);
            pw.flush();
            int c = 0;
            StringBuilder sb = new StringBuilder();
            //while loop reads each character into stringbuilder
            while ((c != -1)) {
                c = isr.read();
                sb.append((char) c);
            }
            //stringbuilder converted to string and printed
            String str = sb.substring(0);
            System.out.println(str);
            //socket closed
            sock.close();
        } catch(IOException i) {
            System.out.println(i.getMessage());
        }
    }
}

Проблема в том, что если я запускаю каждую программу в отдельном cmd.exe, они не связываются, несмотря на использование localhost в качестве IP-адреса. Я не могу найти логическую ошибку в коде, который вызывает это, и задавался вопросом, может ли кто-нибудь помочь?

1 Ответ

1 голос
/ 10 июля 2019

Проблема в том, что вы используете BufferedOutputStream и закрываете сокет сразу после записи в PrintWriter. То, что вы написали, остается в буфере, и сокет закрывается до того, как что-либо будет отправлено клиенту.

Вам нужно flush перед закрытием, чтобы принудительно отправить содержимое буфера:

...
//close socket
pw.flush();
rs.close();
...

TimeClient содержит незначительную ошибку: вы зацикливаетесь на получении, пока не получите -1, что является правильным, но вы добавляете это -1 к StringBuilder, что неверно. Должно быть:

//while loop reads each character into stringbuilder
while(true){
c = isr.read();
if (c == -1) { break; }
sb.append((char) c);
}

Но это никогда не должно мешать отображению текста ...

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