繁体   English   中英

使用BufferedReader / BufferedWriter的套接字连接

[英]Socket connection using BufferedReader / BufferedWriter

我的服务器没有向客户端发送带有BufferedWriter的响应。 似乎代码停止在int amountOfNumbersToBeGenerated = Integer.parseInt(bufferedReader.readLine()); 我相信客户端上的bufferedreader.readline()调用在某种意义上是引起和发出并阻塞了连接的。

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

public class ThreadedConnection implements Runnable {

    private Socket connection;
    private InputStream in;
    private OutputStream out;

    public ThreadedConnection(Socket connection) {
        this.connection = connection;
        try {
            this.in = this.connection.getInputStream();
            this.out = this.connection.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));
        try {

            String lotteryType = bufferedReader.readLine(); //reads first line of input stream

            int amountOfNumbersToBeGenerated = Integer.parseInt(bufferedReader.readLine());
            System.out.println("3"+amountOfNumbersToBeGenerated);
            switch (lotteryType) {
                case "LuckyForLife":

                        generateLotteryNumbers(amountOfNumbersToBeGenerated, 48, 18, bufferedWriter);
                    break;
                case "MegaMillions":
                    generateLotteryNumbers(amountOfNumbersToBeGenerated, 70, 25, bufferedWriter);
                    break;
                case "PowerBall":
                    generateLotteryNumbers(amountOfNumbersToBeGenerated, 69, 26, bufferedWriter);
                    break;
                default:
                    break;
            }
            bufferedWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                connection.close();
                bufferedReader.close();
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void generateLotteryNumbers(int amountOfNumbersToBeGenerated, int upperLimitOfGeneratedNumbers, int upperLimitOfExtraNumber, BufferedWriter bufferedWriter){
        RandomNumberGenerator randomNumbers = new RandomNumberGenerator(amountOfNumbersToBeGenerated,upperLimitOfGeneratedNumbers);
        RandomNumberGenerator extraNumber = new RandomNumberGenerator(1,upperLimitOfExtraNumber);
        ArrayList randomNumbersArrayList = randomNumbers.NumberGenerator();
        ArrayList extraNumberArrayList = extraNumber.NumberGenerator();
        String randomNumbersString = randomNumbersArrayList.toString();
        randomNumbersString = randomNumbersString.substring(1, randomNumbersString.length()-1);
        String extraNumberString = extraNumberArrayList.toString();
        extraNumberString = extraNumberString.substring(1, extraNumberString.length()-1);

        try {
            bufferedWriter.write(randomNumbersString);
            bufferedWriter.newLine();
            bufferedWriter.write(extraNumberString);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

//        System.out.println(randomNumbersString);
//        System.out.println(extraNumberString);
    }
}

这是客户端的代码。 我认为第一个String gerneretedNumber = bufferedReader.readLine(); 造成了问题。 当没有任何内容从服务器写出,然后弄乱服务器端的读取时,几乎就像调用读取一样。 如果我阻止了两个readline()调用,则服务器上的代码可以工作,并且可以在控制台上打印出一些内容。

static void runClient(){
        OutputStream outputStream;
        InputStream inputStream;

        Socket client;
        BufferedWriter bufferedWriter;
        BufferedReader bufferedReader;

        try {
            System.out.println("Creating client socket ");
            client = new Socket("127.0.0.1", 5000);

            outputStream = client.getOutputStream();
            inputStream = client.getInputStream();
            bufferedWriter = new BufferedWriter(new 
OutputStreamWriter(outputStream));
            //bufferedReader = new BufferedReader(new 
InputStreamReader(System.in));
            bufferedReader = new BufferedReader(new 
InputStreamReader(inputStream));

            bufferedWriter.write("LuckyForLife");
            bufferedWriter.newLine();
            bufferedWriter.write("5");
            bufferedWriter.flush();

            String generetedNumber = bufferedReader.readLine();
            String extraNumber = bufferedReader.readLine();

                System.out.println(gerneretedNumber);
                System.out.println(extraNumber);


            System.out.println("Guess its null");
            bufferedReader.close();
            bufferedWriter.close();
            client.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

如果需要更多信息,我很乐意将其发布。

您的客户永远不会发送第二个换行符。 给定您的协议,客户端不会半关闭(输出关闭),因此服务器无法检测到流的末尾。

顺便说一句,尝试在关闭套接字(tcp RST)之前关闭流(tcp FIN); 这更“合乎道德”! 顺便说一句,tcp rst是一个杀手,未决字节可能不会被刷新掉(尽管您在这里有很多刷新,但这只是个好习惯)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM