gpt4 book ai didi

java - 服务器向客户端发送信息但无法得到答案

转载 作者:行者123 更新时间:2023-12-01 14:40:43 24 4
gpt4 key购买 nike

我正在编写一个简单的客户端-服务器程序,我的问题是服务器不等待客户端的答复,这会导致 IOException。服务器尝试执行时发生异常

line = bufferStringFromClientReader.readLine();

我做错了什么?

服务器:

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

public class Server {

private final static String filePath = "dataFile.txt";

public static void main(String[] arg) {
ServerSocket serverSocket = null;
Socket serverConnection = null;
OutputStream outServerStream = null;
InputStream inServerStream = null;
PrintWriter printWriterDataSender = null;
BufferedReader bufferDataFromFileReader = null;
BufferedReader bufferStringFromClientReader = null;
BufferedWriter bufferedStringToFileWriter = null;
String line;

try {
serverSocket = new ServerSocket(8868);
} catch (IOException e) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można utowrzyć gniazda serwera");
}

try {
serverConnection = serverSocket.accept();
} catch (IOException e) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można nawiązać połączenia z klientem");
}

try {
inServerStream = serverConnection.getInputStream();
} catch (IOException e) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
}

try {
outServerStream = serverConnection.getOutputStream();
bufferDataFromFileReader = new BufferedReader(new FileReader(filePath));
bufferedStringToFileWriter = new BufferedWriter(new FileWriter(filePath, true));
} catch (IOException e) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
}

while (true) {

try {
printWriterDataSender = new PrintWriter(outServerStream);
line = bufferDataFromFileReader.readLine();
printWriterDataSender.println(line);
printWriterDataSender.flush();
printWriterDataSender.close();;

bufferStringFromClientReader = new BufferedReader(new InputStreamReader(inServerStream));

System.out.println("get answer from client");

line = bufferStringFromClientReader.readLine();

bufferedStringToFileWriter.write(line);
bufferedStringToFileWriter.close();

} catch (Exception e) {

System.out.println("utracono polaczenie");
try {
serverConnection = serverSocket.accept();
} catch (IOException e1) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można nawiązać połączenia z klientem");
}

try {
inServerStream = serverConnection.getInputStream();
} catch (IOException e2) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
}

try {
outServerStream = serverConnection.getOutputStream();
} catch (IOException e3) {
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
}
}
}
}}

客户:

import java.awt.EventQueue;
import java.io.*;
import java.util.*;
import java.net.*;
import javax.swing.*;


public class Client {

public static void main(String[] args)
{

Socket clientSocket = null;
InputStream clientInputStream = null;
OutputStream clientOutputStream = null;
BufferedReader clientBufferReader = null;

try
{
clientSocket = new Socket("localhost", 8868);
}
catch(UnknownHostException e)
{
throw new RuntimeException("Nieobsłużony wyjątek - nieznana nazwa hosta");
}
catch(IOException e)
{
throw new RuntimeException("Nieobsłużony wyjątek - nie można utowrzyć gniazda klienta");
}

try
{
clientInputStream = clientSocket.getInputStream();
}
catch(IOException e)
{
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
}

try
{
clientOutputStream = clientSocket.getOutputStream();
}
catch(IOException e)
{
throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
}

try
{
clientBufferReader = new BufferedReader(new InputStreamReader(clientInputStream));
}
catch(Exception e)
{
throw new RuntimeException("Nieobsłużony wyjątek - nie można utworzyć bufora odczytu danych od serwera");
}

try
{
String tmpString = clientBufferReader.readLine();
System.out.println(tmpString);



PrintWriter answer = new PrintWriter(clientOutputStream);

answer.println("ans \n");
answer.close();


}
catch(Exception e)
{
throw new RuntimeException("Nieobsłużony wyjątek - odpowiedz");
}
}

最佳答案

问题是您过早关闭了服务器的PrintWriter。这样做会导致阻止从 Socket 的 InputStream 读取任何数据。

printWriterDataSender.close();

在所有 Socket IO 操作完成之后将其移至 finally block 将解决该问题。确保 socket.close 在此之后发生:

printWriterDataSender.close();
bufferStringFromClientReader.close();
serverConnection.close(); // last call

此外,一旦完成此操作,您可能会想要进行一次读取。目前,您正在 while 循环中进行读写,但客户端仅写入一次。这将导致 Socket 读取异常。

另请参阅:Reading from and Writing to a Socket

关于java - 服务器向客户端发送信息但无法得到答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989791/

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