gpt4 book ai didi

java - 使用 BufferedReader/BufferedWriter 进行套接字连接

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:39 24 4
gpt4 key购买 nike

我的服务器未向客户端发送带有 BufferedWriter 的响应。代码似乎停在 int amountOfNumbersToBeGenerate = 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();
}
}

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

最佳答案

你的客户端永远不会发送第二个换行符。根据您的协议(protocol),客户端不会半关闭(输出关闭),因此服务器无法检测到流结束。

顺便说一句,在关闭套接字(tcp RST)之前尝试关闭流(tcp FIN);这更“道德”!开个玩笑,tcp rst 是一个kill,并且挂起的字节可能不会被刷新(尽管这里有很多刷新,但这只是一个很好的做法)。

关于java - 使用 BufferedReader/BufferedWriter 进行套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com