【发布时间】:2015-01-10 23:49:16
【问题描述】:
我正在尝试创建一个简单的客户端,首先我与服务器通信:
- 文件名
- 组成文件的块序列
所以对于第一个我想使用 BufferedWriter 的方法:做出这个选择是因为从不推荐使用 readLine() 方法的那一刻起,我就不能在服务器上使用 InputStreamReader。但是,对于第二个,我使用了 OutputStreamWriter,因为在套接字上写入字节数组是更好的(唯一?)一种选择。
所以,这是我的客户端代码的第一个版本:
public class Client
{
private static final int PART_SIZE = 1000000; // 1MB
public static void main(String[] args) throws IOException
{
final Path file = Paths.get(args[0]);
final String filenameBase = file.getFileName().toString();
final byte[] buf = new byte[PART_SIZE];
Socket socket = new Socket(InetAddress.getLocalHost(),8080);
System.out.println("Socket created");
int partNumber = 0;
Path part;
int bytesRead;
byte[] toWrite;
try (
final InputStream in = Files.newInputStream(file);
final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
final DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
) {
System.out.println("closed="+socket.isClosed());
bw.write(filenameBase,0,filenameBase.length());
//other stuff for the chunk creation and spedition
}
}
}
但是,如果我运行此代码,则会发生此异常:
Exception in thread "main" java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:121)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:316)
at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
at java.io.BufferedWriter.close(BufferedWriter.java:266)
at PAD.Charlie.Client.App.main(App.java:50)
奇怪的是,如果我在try 中更改BufferedWriter 和DataOutputStream 之间的顺序,一切正常!
其实这个想法是因为我从java课程中想起了一些关于它的东西,但是我真的不记得细节了!你能帮我解决我的这个疑问吗?非常感谢! :)
【问题讨论】:
标签: java sockets client bufferedwriter dataoutputstream