는 내가 서버에 comunicate 수 처음에는 간단한 클라이언트를 만들려고 해요 :DataoutputStream 및 BufferedWriter 생성 순서가 중요한 이유는 무엇입니까?
- 파일명
- 첫 번째에 대한
그래서 파일을 구성하는 덩어리의 순서 나는 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
}
}
}
는, 그러나이 코드이 예외 occours 실행하는 경우 :
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)
이상한 것은이를 가 나는 경우 안에있는 BufferedWriter
과 DataOutputStream
사이의 순서를 변경해도 좋습니다.
실제로 자바 코스에서 뭔가 기억하고 있기 때문에 아이디어가 나왔습니다.하지만 세부 사항을 기억할 수는 없습니다. 내가 가지고있는 의심에 대해 저를 도울 수 있습니까? 고마워요! :)
그럼 당신은 작성하는 저에게 방법을 제안 할 수있다 : 1. 문자열을 한 번만 2.이 ByteArray 크기 3. 전체 파일 WAST까지 4 반복 2. 들어 – TwistAndShutter
을 보내 ByteArray에있는 수 filename은'writeUTF()'와'readUTF()'를 사용하고 독자와 작성자를 모두 없앱니다. 크기의 경우'writeInt()'또는'writeLong()'등. – EJP