글
예제링크를 클릭해보면 확인되겠지만,
id를 가지고, 채팅방을 구성합니다. 생성하려는 id가 이미 있으면,
그 방에 들어갈지, 아님 다른걸 구성할지 confirm을 통해 물어봅니다.
글씨에 색깔이 들어갑니다. 색깔은 계속 기억됩니다.
-----
한글 닉일때, 문제가 발생했었는데, 무식한 방법으로 해결했습니다.
여하튼 더이상 문제는 없습니다.
=======================================================
다운로드링크: http://www2.ssam.biz/blog/file/chat.rar
예제 링크 : http://www2.ssam.biz/chat/
접속자처리..로 이번엔 완벽하게 수정한 버전이다.
$t = date("s");
$t = $t / 3;
if($t % 3 < 1) {
$guest1 = $db."_guest1";
$guest2 = $db."_guest2";
$guest3 = $db."_guest3";
} else if($t % 3 > 1) {
$guest1 = $db."_guest3";
$guest2 = $db."_guest1";
$guest3 = $db."_guest2";
} else {
$guest1 = $db."_guest2";
$guest2 = $db."_guest3";
$guest3 = $db."_guest1";
}
우선 현재시간의 초를 구해서, 그걸 3로 나누고, 다시 3으로 나눠서,
매 3초마다, $guest1,$guest2,$guest3 의 파일이 바뀌도록 한다.
두개로 했더니, (하나는 나타내고, 하나는 기록하고..)
문제가 뭐냐면, 끊어진 접속자를 지워낼수가 없더란 것이다.
fopen(파일,"w") 이걸로 해야, 사라진 접속자를 지워낼수 있는데,
이걸로 했다간 누가 접속할때마다, 기존에 저장된 내용도 지워지니까,, 전혀 무의미하고,
fopen(파일,"a") 이걸로 하자니, 계속 기록이 누적될뿐,
오래된 기록을 지워내질 못하고,,
해서 3편제로 나눠서,
$guest3 이거는 누가 접속하든 계속 삭제하고,
$guest2 이거는 기록하고,
$guest1 이거는 나타내고 하는 방식으로..
.. 3초마다, 그 이름에 해당하는 파일이 순환되도록 해서,
가장 오래된 기록도 6초 후엔 삭제되도록.. 했다.
이 방식은 이전꺼에도 썼던건데,
시간배분을 잘못했다..
6초마다 바뀌도록 한다고 했는데,, 뭔가 큰 실수가 있었다.
$name = ($_COOKIE[name]) ? $_COOKIE[name] : $_SERVER[REMOTE_ADDR];
$name = $name."<br>";
$fm = fopen($guest1,"a+");
$fs = fopen($guest2,"a+");
$memo = fgets($fm);
$meme = fgets($fs);
if(!strchr($memo, $name)) fputs($fm, $name);
if(!strchr($meme, $name)) fputs($fs, $name);
fclose($fm);
fclose($fs);
@unlink($guest3);
$memo = preg_replace('`([0-9]+)\.[0-9]+\.[0-9]+\.([0-9]+)`i','$1.**.**.$2',$memo);
echo $memo;
역시 압축파일 소스의 일부분인데,
쿠키(글올릴때 닉이 저장됨)가 있으면 쿠키로 없으면, ip로
현재 접속자정보를 나타내는 첫번째템프파일, 기록전담하는 두번째템프파일에 기록한다.
동일한 이름이 있는지 검색해서, 없으면,.
그리고 세번째템프파일을 삭제한다.
ip는 나타낼때 중간부분을 감춰서 나타낸다.
nzeo.com에서 질문했다가, 직접 테스트해서 알아낸 방법론을 사용했는데,
$fm = fopen($guest1,"a+"); 이거다.
기존에는 $fm = fopen($guest1,"a");
이렇게 해서 쓰기만 되는걸로 했는데,
$fm = fopen($guest1,"a+"); 이렇게 하면 읽기도 가능하다.
단 읽는게 먼저, 쓰는게 나중에 나와야 한다.
그 덕에.. 내용을 우선 읽어서,
현재 기록할려고 하는거하고, 중복되는게 있는지 검색한 후에
없으면 기록하고, 아니면 마는 방식으로 할수가 있다.
위에서처럼...
위에서는 기록을 첫번째템프,두번째템프에 모두 하는데,
변동사항의 갱신을 빠르게 하기 위해서다.
그래도 첫번째템프에는 접속이 끊어진 사람의 기록이 남아있을수 있다.
(3초 전부터 기록된거라)
두번째템프는 그 시간에 새로 생성된 것이라,, 기록이 끊어진 사람의 정보는 없다.
첫번째템프의 낡은 기록은 3초뒤에 그 파일이 세번째템프가 되어, 삭제되면서 없어진다.
-----------
파일은 맨위에 링크한 압축파일이다.
전부 xmlHTTP로 페이지를 읽어오는 방식이라서, 리프레쉬는 없다.
xmlHTTP로 하느라고,, (ajax라고 그러던가,, 그냥 대충 쓰기만 하지.. 이름을 잘 모른다.)
인코딩이 UTF-8이다. euc-kr 이면,, 뭐 좀 희한한 처리를 해줘야 한다. (그러느라고 부하도 늘고..)
4번째줄에
$db = date("Ym"); // 변경가능
이렇게 돼있다. 디비이름을 그냥 "연월"로 했다.
이건 누가 쓸란지 몰라도, 쓰게 될때, 각자 알아서 수정하면 된다.
날짜별로 바뀌게 하려면 date("Ymd"); 로 하면 될테고...
프레임 세조각으로 구성되어 있다,
왼쪽에 접속자, 우측 넓게 채팅메인화면, 하단에 글쓰는 폼.
==========
접속자 정보 5초에서 3초로 바꾸고,
기존에 저장된 파일을 php로 짜맞춰서 출력된 내용을 ajax로 읽어오던 방식에서,
파일자체를 ajax로 읽어다가, 자바스크립트로 table같은거 짜넣는 방식으로 바꿨다.
자바스크립트로 클라이언트에서 처리하도록 했지만, 그정도가 큰 부하를 줄거같진 않고,
트래픽을 많이 줄이는 잇점이 더 클거 같기 때문이다.
하여튼,, 큰 변화가 있었다.
채팅본문이 출력되는 쪽과, 접속자정보가 나오는 쪽은
리프레시를 전혀 안하게 되었다는 것.
글을 입력하는 쪽도, header("location:?v=r"); 이걸로 처리해서,
언듯 보면, 전혀 refresh 한거 같지 않다..
압축파일은 다시 업로드했다.
=============
중요한 실수가 있었다.
$t % 3 했을때의 값이, 소수점 아래인줄 알고,, 실수를 했는데,
바로 잡았다.
현재시간..
칼라선택 추가함...
-------
자바스크립트로 셀렉트박스에서 특정항목을
선택되도록 하는게, 어려울줄 알았더니..
의외로 쉽다.
그냥
셀렉트박스 name=fcolor였는데,
document.all.fcolor.value='뭐'
이렇게 하니까, 그냥 선택된다.
그냥 input의 value를 스크립트로 만드는거하곤,
좀 다를줄 알았더니, (뭔가 좀 동적인 느낌이라)
다를게 없다..
왜냐면, 한번 어떤 색으로 글을 올리고,
다시 반복해서 선택하지 않고도,
그 색이 자동으로 선택되어 있어야,, 안귀찮으니까.
그래서,, 찾아본건데,, 의외로 간단해서,,
뭐 그렇다는 얘기다.
우선.. 수정했습니다.
UTF-8로 인코딩되서 생성된 파일을..
ajax로 읽어와서,, 자릿수로 이름과 날짜등을 구분해서 출력하는데,
....
이름에 한글이 나올때,
ajax는 한글자를 하나로 자르는군요.
php에서는 두개로 인식하는데,,....
그래서 계속.. 안맞았던 겁니다.
ajax의 문제라기 보다, 자바스크립트.
substr(0, 20) 이렇게 했는데, 자바스크립트는 한글 1글자를 1칸으로 인식하니까,
문제가 되었던 겁니다. 지금은 아예 구분자를 넣어서,,
splt을 써서 이름하고 나머지하고 구분하고,, 뭐 그렇게 하고 있습니다.
따라서,
안정적으로 작동합니다.. 파일은 수정해서 업로드 했구요.
id를 가지고, 채팅방을 구성합니다. 생성하려는 id가 이미 있으면,
그 방에 들어갈지, 아님 다른걸 구성할지 confirm을 통해 물어봅니다.
글씨에 색깔이 들어갑니다. 색깔은 계속 기억됩니다.
-----
한글 닉일때, 문제가 발생했었는데, 무식한 방법으로 해결했습니다.
여하튼 더이상 문제는 없습니다.
=======================================================
다운로드링크: http://www2.ssam.biz/blog/file/chat.rar
예제 링크 : http://www2.ssam.biz/chat/
접속자처리..로 이번엔 완벽하게 수정한 버전이다.
$t = date("s");
$t = $t / 3;
if($t % 3 < 1) {
$guest1 = $db."_guest1";
$guest2 = $db."_guest2";
$guest3 = $db."_guest3";
} else if($t % 3 > 1) {
$guest1 = $db."_guest3";
$guest2 = $db."_guest1";
$guest3 = $db."_guest2";
} else {
$guest1 = $db."_guest2";
$guest2 = $db."_guest3";
$guest3 = $db."_guest1";
}
우선 현재시간의 초를 구해서, 그걸 3로 나누고, 다시 3으로 나눠서,
매 3초마다, $guest1,$guest2,$guest3 의 파일이 바뀌도록 한다.
두개로 했더니, (하나는 나타내고, 하나는 기록하고..)
문제가 뭐냐면, 끊어진 접속자를 지워낼수가 없더란 것이다.
fopen(파일,"w") 이걸로 해야, 사라진 접속자를 지워낼수 있는데,
이걸로 했다간 누가 접속할때마다, 기존에 저장된 내용도 지워지니까,, 전혀 무의미하고,
fopen(파일,"a") 이걸로 하자니, 계속 기록이 누적될뿐,
오래된 기록을 지워내질 못하고,,
해서 3편제로 나눠서,
$guest3 이거는 누가 접속하든 계속 삭제하고,
$guest2 이거는 기록하고,
$guest1 이거는 나타내고 하는 방식으로..
.. 3초마다, 그 이름에 해당하는 파일이 순환되도록 해서,
가장 오래된 기록도 6초 후엔 삭제되도록.. 했다.
이 방식은 이전꺼에도 썼던건데,
시간배분을 잘못했다..
6초마다 바뀌도록 한다고 했는데,, 뭔가 큰 실수가 있었다.
$name = ($_COOKIE[name]) ? $_COOKIE[name] : $_SERVER[REMOTE_ADDR];
$name = $name."<br>";
$fm = fopen($guest1,"a+");
$fs = fopen($guest2,"a+");
$memo = fgets($fm);
$meme = fgets($fs);
if(!strchr($memo, $name)) fputs($fm, $name);
if(!strchr($meme, $name)) fputs($fs, $name);
fclose($fm);
fclose($fs);
@unlink($guest3);
$memo = preg_replace('`([0-9]+)\.[0-9]+\.[0-9]+\.([0-9]+)`i','$1.**.**.$2',$memo);
echo $memo;
역시 압축파일 소스의 일부분인데,
쿠키(글올릴때 닉이 저장됨)가 있으면 쿠키로 없으면, ip로
현재 접속자정보를 나타내는 첫번째템프파일, 기록전담하는 두번째템프파일에 기록한다.
동일한 이름이 있는지 검색해서, 없으면,.
그리고 세번째템프파일을 삭제한다.
ip는 나타낼때 중간부분을 감춰서 나타낸다.
nzeo.com에서 질문했다가, 직접 테스트해서 알아낸 방법론을 사용했는데,
$fm = fopen($guest1,"a+"); 이거다.
기존에는 $fm = fopen($guest1,"a");
이렇게 해서 쓰기만 되는걸로 했는데,
$fm = fopen($guest1,"a+"); 이렇게 하면 읽기도 가능하다.
단 읽는게 먼저, 쓰는게 나중에 나와야 한다.
그 덕에.. 내용을 우선 읽어서,
현재 기록할려고 하는거하고, 중복되는게 있는지 검색한 후에
없으면 기록하고, 아니면 마는 방식으로 할수가 있다.
위에서처럼...
위에서는 기록을 첫번째템프,두번째템프에 모두 하는데,
변동사항의 갱신을 빠르게 하기 위해서다.
그래도 첫번째템프에는 접속이 끊어진 사람의 기록이 남아있을수 있다.
(3초 전부터 기록된거라)
두번째템프는 그 시간에 새로 생성된 것이라,, 기록이 끊어진 사람의 정보는 없다.
첫번째템프의 낡은 기록은 3초뒤에 그 파일이 세번째템프가 되어, 삭제되면서 없어진다.
-----------
파일은 맨위에 링크한 압축파일이다.
전부 xmlHTTP로 페이지를 읽어오는 방식이라서, 리프레쉬는 없다.
xmlHTTP로 하느라고,, (ajax라고 그러던가,, 그냥 대충 쓰기만 하지.. 이름을 잘 모른다.)
인코딩이 UTF-8이다. euc-kr 이면,, 뭐 좀 희한한 처리를 해줘야 한다. (그러느라고 부하도 늘고..)
4번째줄에
$db = date("Ym"); // 변경가능
이렇게 돼있다. 디비이름을 그냥 "연월"로 했다.
이건 누가 쓸란지 몰라도, 쓰게 될때, 각자 알아서 수정하면 된다.
날짜별로 바뀌게 하려면 date("Ymd"); 로 하면 될테고...
프레임 세조각으로 구성되어 있다,
왼쪽에 접속자, 우측 넓게 채팅메인화면, 하단에 글쓰는 폼.
==========
접속자 정보 5초에서 3초로 바꾸고,
기존에 저장된 파일을 php로 짜맞춰서 출력된 내용을 ajax로 읽어오던 방식에서,
파일자체를 ajax로 읽어다가, 자바스크립트로 table같은거 짜넣는 방식으로 바꿨다.
자바스크립트로 클라이언트에서 처리하도록 했지만, 그정도가 큰 부하를 줄거같진 않고,
트래픽을 많이 줄이는 잇점이 더 클거 같기 때문이다.
하여튼,, 큰 변화가 있었다.
채팅본문이 출력되는 쪽과, 접속자정보가 나오는 쪽은
리프레시를 전혀 안하게 되었다는 것.
글을 입력하는 쪽도, header("location:?v=r"); 이걸로 처리해서,
언듯 보면, 전혀 refresh 한거 같지 않다..
압축파일은 다시 업로드했다.
=============
중요한 실수가 있었다.
$t % 3 했을때의 값이, 소수점 아래인줄 알고,, 실수를 했는데,
바로 잡았다.
현재시간..
칼라선택 추가함...
-------
자바스크립트로 셀렉트박스에서 특정항목을
선택되도록 하는게, 어려울줄 알았더니..
의외로 쉽다.
그냥
셀렉트박스 name=fcolor였는데,
document.all.fcolor.value='뭐'
이렇게 하니까, 그냥 선택된다.
그냥 input의 value를 스크립트로 만드는거하곤,
좀 다를줄 알았더니, (뭔가 좀 동적인 느낌이라)
다를게 없다..
왜냐면, 한번 어떤 색으로 글을 올리고,
다시 반복해서 선택하지 않고도,
그 색이 자동으로 선택되어 있어야,, 안귀찮으니까.
그래서,, 찾아본건데,, 의외로 간단해서,,
뭐 그렇다는 얘기다.
우선.. 수정했습니다.
UTF-8로 인코딩되서 생성된 파일을..
ajax로 읽어와서,, 자릿수로 이름과 날짜등을 구분해서 출력하는데,
....
이름에 한글이 나올때,
ajax는 한글자를 하나로 자르는군요.
php에서는 두개로 인식하는데,,....
그래서 계속.. 안맞았던 겁니다.
ajax의 문제라기 보다, 자바스크립트.
substr(0, 20) 이렇게 했는데, 자바스크립트는 한글 1글자를 1칸으로 인식하니까,
문제가 되었던 겁니다. 지금은 아예 구분자를 넣어서,,
splt을 써서 이름하고 나머지하고 구분하고,, 뭐 그렇게 하고 있습니다.
따라서,
안정적으로 작동합니다.. 파일은 수정해서 업로드 했구요.
'웹스터디 > nosqlboardchat' 카테고리의 다른 글
채팅 소스 59 (mysql 안씀, ajax) (0) | 2008.05.26 |
---|---|
채팅 소스 58 (mysql 안씀, ajax) (0) | 2008.05.26 |
채팅 소스 57 (mysql 안씀, ajax) (1) | 2008.05.26 |
채팅 소스 56 (mysql 안씀, ajax) (0) | 2008.05.26 |
채팅 소스 55 (mysql 안씀, ajax) - 닉도용 방지 (0) | 2008.05.26 |
간단한 채팅소스 6 (0) | 2008.05.26 |
간단한 채팅소스5 (1) | 2008.05.26 |
간단한 채팅소스4 (0) | 2008.05.26 |
간단한 채팅소스3 (0) | 2008.05.26 |
간단한 채팅소스2 (1) | 2008.05.26 |
RECENT COMMENT