아래는 Clojure 테스트 소스이다.
(defn test-srv2 []다음은 PHP 클라이언트 소스 코드이다.
(let [server (new java.net.ServerSocket 10013)]
(loop [nextClient (. server accept)]
(let [reader (new java.io.BufferedReader (new java.io.InputStreamReader (. nextClient getInputStream)))
out (. nextClient getOutputStream)
pout (new java.io.PrintStream out)
msg (. reader readLine)]
(. nextClient shutdownInput)
(if (not (= msg "exit"))
(do
(. pout print msg)
(. out flush)
(. out close)
(. nextClient close)
(recur (. server accept)))
(do
(. out close)
(. nextClient close)))))
(. server close)))
$port = 10013;
$address = "localhost";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket == false) {
die("socket create_failed");
}
$result = socket_connect($socket, $address, $port);
if($result == false) {
die("socket connection failed");
}
$msg = $_GET['msg'];
if( strlen($msg) == 0 ) {
$msg = "default message";
}
$msg .= "\n";
socket_write($socket, $msg, strlen($msg));
//header("Content-type: text/xml");
while($out = socket_read($socket, 2048)) {
echo $out;
}
socket_close($socket);
이 소스는 1:1 연결이 가능하다. msg 라는 인자로 해당 php를 호출하면, 그에 따른 문장을 돌려준다. (일종의 echo서버..)
그런데 여기서 문제가 있다. 서버에서 read/write 하는 부분은 한 쓰레드 안에 들어있기때문에(서버 생성과 동일한 스레드) 한번에 하나씩밖에 연결을 처리한다.
다음으로 해야할 일은 서버를 만드는 것은 한번만 하고, 새로운 접속이 일어나면 해당하는 소켓을 인자로 넘겨받아 처리하는 스레드 루틴이 필요하다.
댓글 없음:
댓글 쓰기