포트 8888에서 연결을 수신하는 서버 응용 프로그램이 있습니다. 클라이언트 응용 프로그램도 만들고 있습니다. 그것은 단순한 응용 프로그램이지만 여러 연결을 관리하는 것이 어렵습니다. 그래서 컴퓨터 사이에서 파일을 보내야합니다. 그렇게하는 방법은 라이트인지 아닌지 모르겠지만 아마도 여러분이 저를 바로 잡을 수 있습니다. 파일을 보낼 때 여기 내 알고리즘은 다음과 같습니다 스트림 쓰기가 완료 될 때까지 대기하는 방법
NetworkStream stream = \\ initialize it
while(someCondition)
{
// first I open the file for reading and read chunks of it
byte[] chunk = fileRead(file, indexStart, indexEnd) // I have a similar method this is just to illustate my point
stream.Write(chunk, \\other params)
// since I often send large files it will be nice if I can wait here
// until the stream.Write is done. when debuging this the while loop
// executes several times then it waits.
}
내가 그 스트림에서 바이트를 읽고 파일에 기록 반대편에
.여러 파일을 보내고 다음 파일로 이동하기 전에 첫 번째 파일이 전송 되었기 때문에 가끔 기다려야합니다. 전송을 완료 한 후 stream.Read 메서드를 사용하여이 문제를 해결할 수 있음을 알고 있습니다. 클라이언트에서 데이터를 다시 전송합니다. 하지만 때로는 stream.write가 언제 완료되는지를 아는 것이 도움이 될 것이라고 믿습니다. 확인
편집
이 그래서 당신의 응답에 따라 나는 예를 들어 클라이언트에 내가 보낼 기획하고 바이트 수를 보낼 수 있습니다. 일단 클라이언트가 많은 바이트를 받으면 그것이 완료되었음을 의미합니다. 그러나 이것이 효율적인 지 내 질문입니다. 내가 서버에
같은 일을 의미 :
쓰기 데이터가
데이터를 읽기 "파일의 길이를 보내는"(예를 들어, 확인 문자열을 기대) "클라이언트가 길이를 받았는지 확인"
쓰기 데이터 "전화 클라이언트 파일의 이름은"
는 데이터가 "클라이언트가 파일의 이름을 recived 있는지 확인"읽기쓰기 데이터가
나는 뭔가를 놓친가요? stream.Write 호출은 차단 될 것이므로 항상 완료 될 때까지 기다립니다. http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.write.aspx – Tejs
필자는 이전에 클라이언트에 파일 그 방법을 부름으로써 파송되었다. stream.Write ("".toByteArray, ...) 그리고 그 문자열은 내가 파일을 올바르게 보낸 후에 분명히 보냈습니다. 하지만 때로는 문자열이 나중에 수신되었고 파일의 청크는 나중에 수신되었습니다. –
다른 말로하면 클라이언트는 길이 x의 문자열이 전송 된 경우마다 확인하는 데 사용한 파일을 받았고 그 다음 파일을 닫으려고했지만 ""이 파일의 일부가 불완전한 파일을 일으키는 부분. –