[질문]리눅스에서 채팅서버 구현시....

jjw1024의 이미지

리눅스에서 채팅 서버를 구현할려고 합니다.

채팅은 방 만들기, 방 들어가기, 대기자, 같은 개념이 있는데

이것을 어떤식으로 구현해야 될까요?

일단 쓰레드를 사용해야 한다는 것은 알겠는데 더이상 어떻게 해야할지 모르겠네요....

많은 도움 부탁드립니다.

indie의 이미지

초보지만 저도 같은 문제들로 고민 했던 것을
생각해 보면 우선 구현에 필요한 기술을
먼저 정하는건 좋지 않다고 생각합니다.

먼저 요구 분석서등을 작성해보세요.
이런저런 기능이 필요하다는둥...
그리고 좀더 구체적으로 설계를 해보세요.
예를 들어 방을 만든다고 하셨으니
방은 누가 만들고 파괴(?)는 누가 할수 있는지
접속자들은 어떻게 관리를 할건지...

그리고 이 방을 운영하는 것을 프로세스로 떠 넘길건지 쓰레드를 돌릴건지
이렇게 자세한 설계과정을 거치면서
실 프로그램 작성시 필요한 기술들을 정하는게 좋지 않을까
생각해 봅니다.

집에나 갈까?

ㅡ,.ㅡ;;의 이미지

jjw1024 wrote:
리눅스에서 채팅 서버를 구현할려고 합니다.

채팅은 방 만들기, 방 들어가기, 대기자, 같은 개념이 있는데

이것을 어떤식으로 구현해야 될까요?

일단 쓰레드를 사용해야 한다는 것은 알겠는데 더이상 어떻게 해야할지 모르겠네요....

많은 도움 부탁드립니다.

님은 어디까지 알고계세요?


----------------------------------------------------------------------------

cdpark의 이미지

동시사용 20-30명까지는 쓰레드 없이 select나 poll 함수만으로 구현가능하고, 성능도 나쁘지 않습니다.

동시사용자 수만명 수준을 원하신다면 아예 이참에 irc 서버를 분석해보시고요.

metalwolf의 이미지

만약 채팅 서버를 처음 만드시는 것이라면 쓰래드 굳이 사용하실 필요 없습니다.

디버깅이 힘들어 오히려 스트레스 받으실 수 있구요. 아마 게임 쪽 을 하실 생각

이신가 본데 대기실 등을 쓰래드로 절대 구현 하지 않습니다. 채널 정도라면 모

를까요... 물론 채널까지도 쓰래드로 구현 하지 않고 시퀀스로 코딩 하셔도

퍼포먼스 나옵니다. 제가 겪어 봤던 일이라 자신합니다. 쓰래드로 구현 하면

필연적으로 성능 향상이 오는것이 아닙니다. 쓰래드로 설계 잘못하시면 괴롭

습니다. 처음이라면 시퀀스로 짜시는 것을 권해 드립니다.

^____^; 방가여

jjw1024의 이미지

좋은 말씀 감사드립니다.

근데 아직 제가 미숙한 관계로 확실히 감이 안 잡히네요...

죄송하지만 소스코드를 구할수 없을까요?

제가 검색에 약해서...아무리 찾아봐도 원하는 코드를 찾을수가 없네요..

jjw1024의 이미지

감사합니다.......

dudungsil의 이미지

http://www.zdnet.co.kr/news/column/jhok/0,39024728,39129167,00.htm

소스부터 구하려는게 그다지 좋게는 보이지 않습니다. 이번에 하고 영원히 안본다면 모르겠지만 삽질이 항상 삽질로 끝나는건 아닙니다.

산넘어 산

sozu의 이미지

dudungsil wrote:
http://www.zdnet.co.kr/news/column/jhok/0,39024728,39129167,00.htm

소스부터 구하려는게 그다지 좋게는 보이지 않습니다. 이번에 하고 영원히 안본다면 모르겠지만 삽질이 항상 삽질로 끝나는건 아닙니다.

저는 문제에 부딧혔을때는 이렇게 합니다.

문제를 정확히 정의합니다.

그리고 계속 이생각을 합니다.

"나라면 어떻게 할것인가?"

스스로 생각하기에 아주 멍청하고 바보스러운 (Trivial 한) 해결 방법이 나올수도 있지만,

재미있게도 대부분의 사람들이 그런 해결방법을 생각하지요.^-^

그 이후에 다른 사람은 어떻게 했나를 보신다면

정말 삽질속에 있는 진리를 찾을수 있지않을까 싶네요.ㅋ

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

lovemyin의 이미지

비록 저도 초보지만 이런 방법은 어떤지 말씀드려봅니다.
우선 서버를 하나로 가지 마시고 대기방 서버, 채팅 서버...이런식으로 나눕니다.
그 앞단에 커넥션 서버를 두시고 커넥션 서버에서 사용자가 대기실에서 채팅방으로 옮겨갈때 사용자와의 커넥션은 커넥션 서버가 그대로 유지한채 커넥션 서버와 실제 서버와의 연결만 바꾸는 방법입니다.
도움이 될수 있을지 모르겠네요... 열심히 하세요

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

jjw1024의 이미지

고수님들의 많은 조언으로 어떤 식으로 채팅 서버를 만들어야 할지 설계를 했습니다.

계속 질문만 하여 죄송하지만 마지막으로 한가지만 더 도움을 청하겠습니다.(나름대로 계속 공부중....^^;)

서버는 리눅스로 구현하고 클라이언트는 mfc로 구현할려고 하는데...

c같은 경우는 순차적으로 동작을 하지만 mfc 같은 경우는 이벤트로 동작을 하는데

제가 아직 처음이라 어떤식으로 구현을 해야 될지 감이 안잡히는군요..

간다하게 예를 들면 서버쪽 코드가 여러개의 함수로 구성(recv하는 부분이 여러개)되어있을때 클라이언트가 이벤트를 발생시키면

서버는 어떻게 어느 함수에서 받은 데이터를 처리해야하는지 알수있는가 하는 겁니다. (예가 적절한가 잘 모르겠군요..)

참고할 만한 사이트나 고수님들의 조언 부탁드립니다.

Zeroidle의 이미지

위에 링크 안따라 가보셨나보네요..

저도 채팅프로그램을 만드는중인데요... 서버랑 클라이언트 둘다

자바로..ㅡ.ㅡ; 제가 할줄아는게 없어서

프로토콜은 자기가 정하기 나름이라네요...

한번 위에 링크 읽어보세요...

제가 갖고있는 책중에 이런게 있네요

500|곰탱이|마누라|뭐하세요?

이런식으로 자기가 만드는거라고 적혀있어요...

첫번째는 대화종류 500은 귓속말이다
500모드일때 두번째는 보내는사람
세번째는 받는사람
네번째는 대화내용

즉, 곰탱이가 마누라 라는 사람에게 "뭐하세요"라고 작업거는것

이런식으로 만들어야된다고하네요..

아 참고로 잘 생각해서 만들어야지 아니면 프로그래밍하다가

다시 일일이 바꿀일도 생긴다고 강조되어있네요

madhatter의 이미지

jjw1024 wrote:

서버는 리눅스로 구현하고 클라이언트는 mfc로 구현할려고 하는데...

c같은 경우는 순차적으로 동작을 하지만 mfc 같은 경우는 이벤트로 동작을 하는데

제가 아직 처음이라 어떤식으로 구현을 해야 될지 감이 안잡히는군요..

간다하게 예를 들면 서버쪽 코드가 여러개의 함수로 구성(recv하는 부분이 여러개)되어있을때 클라이언트가 이벤트를 발생시키면

서버는 어떻게 어느 함수에서 받은 데이터를 처리해야하는지 알수있는가 하는 겁니다. (예가 적절한가 잘 모르겠군요..)

보통은 전문 code 로 관리합니다. 일정한 전문 포맷을 정한 다음 클라이언트 단에서는 그냥 전문을 던지는 방식을 씁니다. 혹여 EJB 나 component를 직접 call하는 방식을 사용한다면 좀 달라지겠지만 그렇게 만들면 범용성이 떨어지겠죠. 서버단에서는 listen 하는 channel은 동일하고 전문 코드에 따라 어떻게 처리할 것인지 case 별로만 각각 맞는 function을 호출해 주면 됩니다.

bear의 이미지

XML로 사용하시는것도 좋을것 같습니다.

<root>
<행동>귓속말</행동>
<받는이>
<유저>bear</유저>
<유저>철이</유저>
</받는이>
<메세지>
<이모티콘>웃자</이모티콘>
<내용> 안녕하세요</내용>
</메세지
</root>

이런식으로 데이터 통신을 해도 괜찮을것 같습니다.

데이터 추출은 dom파서를 사용해도 되고요..

즐거운 하루 되세요..^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.