현재 Java를 사용하여 소켓을 열고 그 위에 데이터를 보내고 보내야하는 응용 프로그램을 작성하고 있습니다.Java BufferedReader 읽기 소켓이 null을 반환하지 않습니다.
BufferedReader.readLine()은 일단 버퍼가 비면 null을 반환한다는 것을 알고 있습니다. 그러나 내 코드 BufferedReader에서 선을 읽는 루프에서 종료되지 않습니다. 아이디어는 노래 목록을받은 다음 노래가 재생되기 시작하는 서버에 값을 보냅니다.
package me.frankvanbever.MediaServerClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class MediaServerClient {
/**
* @param args
*/
public static void main(String[] args) {
Socket server;
try {
server = new Socket("10.42.0.41" , 2626);
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(in) , 4096);
String inputline;
while((inputline = bin.readLine()) != null){
System.out.println(inputline);
}
System.out.println("exited loop");
out.write('1');
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
}
이 정상적인 동작입니다 :
이
코드인가? 서버는 파이썬으로 작성되었으며 소스 코드를 변경할 수 있습니다.
그래서 내 클라이언트가 서버에서 물건을 보내지 못하게한다는 것을 알리는 방법을 강구해야할까요? –
@FrankVanbever : 프로토콜 자체에 서버를 구축해야합니다. 서버와 클라이언트 모두 동의해야합니다. 당신은 "5 초 동안 아무 것도받지 못했다면 나는 끝났다고 가정 할 것"이라는 라인을 따라 효과적으로 뭔가를 가질 수 있습니다. 그러나 느린 네트워크에도 불구하고 매우 약해지고, 빠른 네트워크를 지원할뿐만 아니라 플랫폼이 시간 초과를 지원하지 않는 한 비교적 코드 작성이 어렵습니다. –
@FrankVanbever 더 이상 전송할 것이 없을 때 연결을 닫을 수 있습니다. 또는 연결을 계속 열어 둘 필요가있을 경우,'[End of Message]'또는 여러분이 선택한 것과 같은 줄을 비어있을 수 있습니다. BTW 전자 메일은 그 자체로 한 줄에'.'을 보냅니다. –