2017-11-30 9 views
-1

일부 파일을 호스트하기 위해 기본 HTTP 서버를 작성했습니다. 길을 따라 나는 서버가 클라이언트 데이터를 받고 있는지 테스트하려고했다. 아래 코드를 사용하면 NoSuchElementException 예외가 발생합니다. 대부분의 경우에도 스캐너는 클라이언트에서 회선을 수신하지 않습니다. 연결이 떨어지거나 서버가 마지막으로 클라이언트 데이터를 수신하기 전에 Java ServerSocket이 임의로 클라이언트 데이터를 수신하지 않습니다.

import java.net.*; 
import java.io.*; 
import java.util.*; 
import java.nio.file.*; 

public class Simple { 


    @SuppressWarnings("empty-statement") 
    public static void main(String[] args) { 
     try{ 
      ServerSocket ss = new ServerSocket(80); 
      while(true){ 
       try{ 
        Socket sock = ss.accept(); 
        InputStream in = sock.getInputStream(); 
        OutputStream out = sock.getOutputStream(); 
        out.write("HTTP/1.1 200 OK\r\nContent-type:text/html;charset=utf-8\r\n\r\n".getBytes()); 
        Scanner sc = new Scanner(in); 
        out.write(sc.nextLine().getBytes()); 
        sock.close(); 
       } catch(Exception ex){ 
        System.err.println(ex); 
       } 
      } 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

} 

이런 일이 발생

는, 클라이언트 연결이 아주 긴 시간 동안 대기 : 여기에 코드입니다. 어떤 도움을 주셔서 감사합니다.

아니요, 이것은 This question과 중복되지 않습니다. (이들은 두 개의 개별 질문입니다).

+0

클라이언트를 멈추려면 catch 블록의 소켓을 닫거나 더 나은 방법으로 여전히 try (소켓 소켓 = ss.accept()) {...} catch ... '를 사용하십시오. –

+0

[mcve ]를 클릭합니다. 실제로이 문제를 해결하려면 연결의 클라이언트쪽에 무엇이 있는지 알아야합니다. 코드 또는 브라우저 또는 다른 코드입니까? –

+1

클라이언트가 요청을 보내기 전에 응답을 보내서 클라이언트를 혼란스럽게하는지 궁금합니다. 이것은 간헐적 인 행동을 설명 할 수 있습니다. –

답변

0

Scanner.nextLine() 전에 Scanner.hasNextLine()으로 전화해야합니다. 그렇지 않으면 확실히이 예외가 트롤됩니다. 소켓과 아무런 관련이 없습니다. 정의 된 동작은 Scanner. NB Java입니다. ServerSocket *never* receives data. An accepted Socket`은 서버 측에서이를 수행합니다.