我在开发一个简单的应用程序时遇到了与I / O相关的问题,我不确定为什么我的代码无法正常工作。我只采用了一些不起作用的代码,并做了一个简单的例子。
服务器类
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(56700);
Socket socket = serversocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (true) {
String line;
if ((line = br.readLine()) != null) {
System.out.println(line);
switch (line) {
case "line":
System.out.println(br.readLine());
break;
case "file": {
try (FileOutputStream fos = new FileOutputStream(new File("file.txt"))) {
byte[] bytes = new byte[4096];
int count;
while ((count = is.read(bytes)) > 0) {
fos.write(bytes, 0, count);
}
}
break;
}
}
}
}
}
}
客户等级
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 56700);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.write("line\n");
pw.write("line test\n");
pw.flush();
try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) {
pw.write("file\n");
pw.flush();
byte[] bytes = new byte[4096];
int count;
while ((count = fis.read(bytes)) > 0) {
fos.write(bytes, 0, count);
}
} catch (IOException ex) {
System.out.println("Error sending the file.");
}
pw.write("\n");
pw.write("line\n");
pw.write("line test 2\n");
pw.flush();
}
}
基本上,我有一个客户端正在向服务器发送数据。客户端使用PrintWriter write(String str)
在感兴趣的数据之前写一行,以识别发送的信息类型:文本行或文件。如您所见,服务器使用BufferedReader readLine()
读取文本行,使用InputStream read(byte[] bytes)
读取文件中的字节。客户端首先发送一行文本,然后发送文件中的数据作为字节,最后再发送一行文本。
问题是服务器成功发送和接收文件后,它不会收到文本行。我检查并意识到BufferedReader永远不会收到这行文本。正如您所看到的,我在写入文件数据后写了一个\n
,以防出现问题,但它无法正常工作。我可能遗漏了与这些流的功能有关的事情。
有什么想法吗?提前谢谢。
答案 0 :(得分:0)
此代码中的问题:
try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) {
pw.write("file\n");
pw.flush();
byte[] bytes = new byte[4096];
int count;
while ((count = fis.read(bytes)) > 0) {
fos.write(bytes, 0, count);
}
} catch (IOException ex) {
System.out.println("Error sending the file.");
}
你使用try-finally和OutputStream fos = socket.getOutputStream()
,在退出try-finally代码块之后你编程关闭socket.getOutputStream()
,因为try-finally始终在隐式{{1}中调用close
方法阻止。您finally
在此使用相同的PrintWriter
:
SocketOutputStream
但是这个流已经关闭了。
试试这个:
pw.write("\n");
pw.write("line\n");
pw.write("line test 2\n");
pw.flush();
如果你只使用一个,那就更好了:PrintWriter或OutputStream