Java 如何在不关闭BufferedReader的情况下从客户端向服务器发送多个应答
首先,我为我的英语感到抱歉。:-)这是我在这里的第一篇文章 我有一个应用程序,类似于torrent。我在一台计算机上运行它,但有两个或多个实例。我必须问用户他想要什么文件,并将此文件发送给客户。如果我希望它是主机对主机还是多主机。 我的问题是:当我发送到目录中的客户机列表文件时,他选择其中一个并发送到服务器nameFile。然后服务器将此文件发送到客户端。但当我发送listFile时,我必须关闭bufferedreader,因为readline()正在阻塞。但如果我关闭了它,我就没有连接了。有什么想法吗? 请接受任何建议。这是我的代码: 服务器:Java 如何在不关闭BufferedReader的情况下从客户端向服务器发送多个应答,java,bufferedreader,Java,Bufferedreader,首先,我为我的英语感到抱歉。:-)这是我在这里的第一篇文章 我有一个应用程序,类似于torrent。我在一台计算机上运行它,但有两个或多个实例。我必须问用户他想要什么文件,并将此文件发送给客户。如果我希望它是主机对主机还是多主机。 我的问题是:当我发送到目录中的客户机列表文件时,他选择其中一个并发送到服务器nameFile。然后服务器将此文件发送到客户端。但当我发送listFile时,我必须关闭bufferedreader,因为readline()正在阻塞。但如果我关闭了它,我就没有连接了。有什
public class Server extends Thread {
private Socket s;
int numerKlienta;
String line;
List<String> list = new ArrayList();
private ServerSocket serverSocket;
String nazwaPliku = "";
PrintWriter outToClient;
String text = "";
String tmp = "";
public Server(int port) throws Exception {
serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToClient = new PrintWriter(clientSocket.getOutputStream(), true);
String path = "C:\\Users\\Ania\\Desktop";
File directory = new File(path);
File[] files = directory.listFiles();
for (int j = 0; j < files.length; j++) {
if (files[j].isFile()) {
text = files[j].getName();
outToClient.println(text);
}
}
//outToClient.flush();
outToClient.close(); //i must close beacuse in client when i writeBytes its blocking next steps
nazwaPliku = inFromClient.readLine();
System.out.println(nazwaPliku);
outToClient.close();
}
}
}
我的主要观点是:
public class Main {
public static void main(String[] args) throws Exception {
Server serwer=null;
System.out.println("Czy czy chcesz rozpocząc pracę jako serwer? (t/n)");
Scanner sc = new Scanner(System.in);
String odpowiedz = sc.next();
if (odpowiedz.equals("t")) {
System.out.println(" Na jakim porcie rozpocząc nasłuch?");
sc = new Scanner(System.in);
int portSerwera = sc.nextInt();
serwer = new Server(portSerwera);
//serwer.start();
}
else{
System.out.println("Czy chcesz rozpocząc połączenie z jakimś serwerem? (t/n)");
sc = new Scanner(System.in);
odpowiedz = sc.next();
if (odpowiedz.equals("t")) {
System.out.println("podaj numer portu do połączenia z serwerem");
sc = new Scanner(System.in);
int portKlienta = sc.nextInt();
Client fc = new Client("localhost", portKlienta);
您需要设计一个包含结构化消息的协议,而不仅仅是发送线路。客户端必须知道消息何时结束 例如,您可以通过发送空行(1)来决定结束文件列表 当客户端读取文件时,当它收到空行时,它知道列表已终止,现在由客户端发送其选择 使用分隔符是一种方法。另一种方法是发送“数据包”,其中每个数据包以数据包中预期的字节或字符数开头。因此,客户机知道它必须读取N个字节才能读取整个数据包,并且一旦数据包被读取,它应该发送它的选择,然后读取另一个数据包(2)
(1) 和(2):请注意,这两种策略由您可能使用最多的协议使用:HTTP。HTTP响应的标头以空行结尾。它通常包含响应主体的内容长度。无需关闭TCP流。只需发送一行特殊代码,表示您已到达文件末尾。@PeterLawrey不可行。您必须选择任何文件中都不可能出现的行。您至少需要一个转义协议。@EJP True,这就是我所说的特殊协议。您可以使用根据定义无效的字符。使用无效文本的字节编码,或者使用简单的转义序列,例如“.”本身加上一个额外的“.”如果行以“.”开头,则该行正常工作。我发送了特别的“结束”:-)Thx以便快速回答。现在我明白我错了。我必须关闭的不是bufferedReader,而是PrintWriter。@Ania.K,所以不要关闭PrintWriter,只需在发送终止字符串后刷新它即可。理想情况下,在套接字连接的生命周期中使用相同的包装器。如果我只是刷新,则无法工作。堵住了。
public class Main {
public static void main(String[] args) throws Exception {
Server serwer=null;
System.out.println("Czy czy chcesz rozpocząc pracę jako serwer? (t/n)");
Scanner sc = new Scanner(System.in);
String odpowiedz = sc.next();
if (odpowiedz.equals("t")) {
System.out.println(" Na jakim porcie rozpocząc nasłuch?");
sc = new Scanner(System.in);
int portSerwera = sc.nextInt();
serwer = new Server(portSerwera);
//serwer.start();
}
else{
System.out.println("Czy chcesz rozpocząc połączenie z jakimś serwerem? (t/n)");
sc = new Scanner(System.in);
odpowiedz = sc.next();
if (odpowiedz.equals("t")) {
System.out.println("podaj numer portu do połączenia z serwerem");
sc = new Scanner(System.in);
int portKlienta = sc.nextInt();
Client fc = new Client("localhost", portKlienta);