아래는 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 하는 부분은 한 쓰레드 안에 들어있기때문에(서버 생성과 동일한 스레드) 한번에 하나씩밖에 연결을 처리한다.
다음으로 해야할 일은 서버를 만드는 것은 한번만 하고, 새로운 접속이 일어나면 해당하는 소켓을 인자로 넘겨받아 처리하는 스레드 루틴이 필요하다.





