2016-12-15 7 views
1

내가 입력 :Clozure Common Lisp에서 소켓을 통해 통신하는 방법은 무엇입니까? 한 CCL REPL에서

(WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667 
          :LOCAL-HOST "localhost" 
          :CONNECT :PASSIVE 
          :REUSE-ADDRESS t) 
    (let ((stream (ACCEPT-CONNECTION socket :wait t))) 
    (format stream "hello from server.~%"))) 

이 연결을 기다립니다. 또 다른 CCL 과정에서

내가 입력 :

(WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667 
           :REMOTE-HOST "localhost" 
           :CONNECT :ACTIVE 
           :REUSE-ADDRESS t) 
    (format t (READ-LINE socket-stream))) 

이 과정이 대기로가는이 시점에서. 서버에서 읽거나 종료하지 않습니다.

그러나 클라이언트가 서버에 연결하는 순간 서버는 NIL로 종료됩니다. 그래서 명확하게 연결이 설정되어 있지만 문자열은 "Hello from server"입니다. 결코 전달되지 않습니다.

나는 그것이 내가 바라보고있는 기본적인 것이라고 확신한다. 메시지는 어떻게 보내나요? READ-LINE은 스트림에서 읽을 수있는 올바른 방법이 아닙니까? 서버에서 잘못 쓰고 있습니까? 양방향 단순 문자열 기반 통신을 어떻게 설정합니까?

+0

': format : text' 옵션 (http://stackoverflow.com/a/1526444/124319)도 있습니다. 도움이되는지 확실하지 않습니다. – coredump

+1

@coredump 형식의 기본값은 CCL 문서에 따른 텍스트입니다. 그래서 불필요합니다. 하지만 고마워. –

답변

7

출력을 버퍼링 할 수 있다는 것을 알고 계십니까?

하나의 일반적인 문제입니다. FINISH-OUTPUT and FORCE-OUTPUT을 참조하십시오.

버퍼링 된 스트림에 쓸 경우 버퍼링 된 출력이 실제로 완전히 전달되는지 확인해야합니다.

? (WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667 
           :REMOTE-HOST "localhost" 
           :CONNECT :ACTIVE 
           :REUSE-ADDRESS t) 
    (format t (READ-LINE socket-stream))) 
hello from server. 
NIL 


--- 

? (WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667 
          :LOCAL-HOST "localhost" 
          :CONNECT :PASSIVE 
          :REUSE-ADDRESS t) 
    (let ((stream (ACCEPT-CONNECTION socket :wait t))) 
    (format stream "hello from server.~%") 
    (finish-output stream) 
    stream)) 
#<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/21) #x302000E3FD9D> 
+0

감사합니다. 나는 형식 호출 후에 링크를 체크 아웃하고 끝 (FINISH-OUTPUT)을 추가했습니다. 아무런 변화도 없었습니다. 그 행동은 똑같습니다. 아마 버퍼링이 문제가되지 않을까요? –

+0

@ λ- : 그리고 어느 스트림에서 'finish-output'을 호출 했습니까? FINISH-OUTPUT에 올바른 흐름을 보냈습니까? –

+0

예. 그게 전부 야. 나는 문서를 꼼꼼하게 읽었습니다. –