Super Chatting 0.82 - 'SuperSocket'과 'ClientEngine'를 이용한 Client/Server

 

SuperSocket_Chatting_20150101.zip

 

 

 

Author  : Dang-Gun Roleeyas ( http://blog.danggun.net/ )
Create date : 2014.12.31
License  : Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

 

'SuperSocket'과 'SuperSocket - ClientEngine'을 이용한 채팅 클라이언트/서버 예제입니다.

슈퍼소켓(SuperSocket)은 '.Net'으로 구현된 서버 프레임웍입니다.

(참고 : SuperSocket - http://www.supersocket.net/)

클라이언트엔진(ClientEngine)은 '.Net'으로 구현된 슈퍼소켓기반 클라이언트 프레임웍입니다.

(참고 : SuperSocket ClientEngine - http://clientengine.codeplex.com/)

 

이전에 만든 비동기 Client/Server 프로그램을 이용하여 만들었습니다.

(참고 : 'SuperSocket'과 'ClientEngine'를 이용한 채팅(Chatting) Client/Server 예제 0.7 )

 

 

1. 주요기능

- 비동기 TCP 통신
- 다중 유저 채팅(Chatting)

- 파일 전송(큰메시지 포함)

2. 구조
2-1. 로그인 구조

ID_Check : 소켓을 연결한후 서버한테 ID가 유효한지 확인요청을 합니다.

ID_Check_Ok, ID_Check_Fail : ID가 유요하면 'ID_Check_Ok'를 유효하지 않으면 'ID_Check_Fail'를 보냅니다.

Login : 아이디가 유효하다면 해당 아이디로 접속요청을 합니다.

Login_Complete : 서버에서 로그인 요청이 완료되었다고 알립니다.

2-2. 파일(큰메시지) 전송 구조

 

LargeData_Start : 보내는 쪽에서 파일의 정보를 만들어 받는 쪽에 받을 준비를 하라고 요청 합니다.

LargeData_Info : 받는 쪽에서 받을 준비가 완료되었음을 알리면서 보낼때 사용할 인덱스를 보내줍니다.

LargeData_Receive : 보내는 쪽에서 1조각의 'dataSend'를 전송합니다.

LargeData_Receive_Complete : 받는 쪽에서 1조각의 'dataSend'를 받았다고 보내는 쪽에 알립니다.

LargeData_End : 모든 조각이 보내졌으면 받는쪽에 모든 데이터를 전송했다고 알립니다.

 

- 파일을 보낼때는 2가지 방식이 있습니다.

한번에 다 보내기, 받는쪽 완료후 보내기

 

모든 조각을 한번에 보내면 메시지가 꼬이는 문제가 있을 수 있습니다.

('SocketAsyncEventArgs'에서도 같은 문제가 있습니다.)

그래서 받는쪽의 확인후 보내는 방식을 기본으로 사용합니다.

 

- 큰메시지는 메모리에 임시저장된다.

큰메시지를 보내면 모든 데이터가 올때까지 받는쪽 메모리에 저장됩니다.

그러므로 받는쪽 메모리 관리가 필수입니다.

 

나중에 하드에 저장하는 방식도 추가할 예정입니다.

 

3. 수정 이력

 

2015.01.01

- 패킷을 무조건 인코딩하여 문자열(string)로 처리하던 방식에서 바이트어레이(byte[])를 잘라서 사용하는 방식으로 변경

- 큰메시지(파일 포함) 전송 추가

 

2014.09.30

 

- 예제 개발 완료

참고 : 'SuperSocket'과 'ClientEngine'를 이용한 채팅(Chatting) Client/Server 예제 0.7 

 

 

  1. real 2015.06.10 17:13 신고  Address  Edit/Delete  Reply

    supersocket관련 글을 찾다가 보게 되었습니다.
    좋은 자료 잘 읽었습니다.

    한가지 말씀드릴게 있다면..

    원문
    - 모든 조각을 한번에 보내면 메시지가 꼬이는 문제가 있을 수 있습니다.

    TCP에서는 보내는 데이타의 순서는 바뀔수 없습니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.06.10 17:35 신고  Address  Edit/Delete

      여기서 말하는 꼬인다는 의미는 일정크기이상의 데이터 tcp로 한번에 보내면 리시브가 뭉치거나 여러번오는 현상을 말합니다.(한번에 여러개의 메시지를 보낼때도 이런 현상이 일어납니다.)
      이런 현상을 별도의 처리를 하지 않으면 데이터가 꼬인것처럼 잘리거나 잘못된 순서로 쌓이는것을 볼수 있죠.

      근데 이게 닷넷프레임웍문제인지 닷넷기반 라이브러리들은 비슷한 현상이 있는것 같더군요.(확인한건 몇개 안되지만 ㅎㅎㅎ)
      'SocketAsyncEventArgs'를 사용할때 이 현상이 왜 일어나며 어떻게 해결하는지 찾았는데 그게 슈퍼소켓에서도 적용될지는 아직 테스트를 해보지 않아 모르겠습니다.
      (제작자에게 문의해보았으나 답변이 없어서;;)

      이게 닷넷에서 무조건 발생하는 것인지 특정 api를 쓸때만 나오는 현상인지 몰라서 그냥 뭉뚱그려서 'tcp 공통 문제'라고 적은것인데 모든 tcp/ip 문제인것처럼 보인다는걸 생각못했네요 ㅎㅎㅎ
      수정하도록 하겠습니다.

  2. uhanking 2015.12.28 13:08 신고  Address  Edit/Delete  Reply

    안녕하세요 슈퍼소켓 자료를 검색중에 도움이 많이 되고 있습니다.

    한가지 궁금한점이 있는데요 클라이언트에서 서버쪽으로 메시지를 짧은메시지를 보낼경우는 문제가 없는데요

    긴 메시지를 보낼경우 연결이 끊기는 문제가 있습니다. 이부분이 너무 궁금해서 댓글 남깁니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.12.28 19:53 신고  Address  Edit/Delete

      흠....긴메시지보내면 짤려서 오는 경우는 있어도 끊기는 경우는 못봤는데....어떤 상황인지 잘 모르겠네요.
      8120 이상으로 보내면 끊긴다는 것이죠?

    • uhanking 2015.12.28 19:57 신고  Address  Edit/Delete

      메시지 보내는것을 응용하여서 현재상태화면을 캡쳐하여 바이트화 시켜서 보내려는 기능을 하는데요 바이트가 1000이 넘어가면 연결이 끊기는 현상이 있습니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.12.30 03:15 신고  Address  Edit/Delete

      그러고보니 그런 증상있었네요.
      일단 구현이 급해서 1000미만으로 잘라서 메시지를 보내도록 구현하긴 했는데 속도가 너무느리다는 단점이 있어서 말이죠 ㅡ.-;;
      해결방법을 찾아보긴 했는데 결국 못찾고 답변달린것도 그렇다한게 없어서 일단 1000미만으로 자르는 방법으로 해결했습니다.
      이거 분명 해결방법이 있을듯 한데.... 영어나 중국어 가능하시면 직접 슈퍼소켓사이트 들어가서 질문 해보시는게 좋을 듯 합니다.
      (전 몇번 남겼는데 못알아 듣겠다는 답변이 ㅜㅡ)

      시간나면 다시 해결방법을 찾아볼 생각인데 너무 바빠서 손도 못대고 있습니다 ㅎㅎㅎ

    • uhanking 2015.12.30 09:30 신고  Address  Edit/Delete

      SuperSocket 소스에서 SuperSocket.SocektBase에서 Config폴더에

      ServerConfig.cs에 버퍼사이즈를 조정하여 새로 DLL생성후 실행하니

      큰데이터도 자르지않고 한번에 넘길 수 있게 해결하였습니다.

    • uhanking 2015.12.30 14:11 신고  Address  Edit/Delete

      소스들이 너무많아 겨우 찾아서 해결이 됬네요!

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.12.31 14:02 신고  Address  Edit/Delete

      헐 그런방법이 있었군요.
      감사합니다~

  3. Steal 2016.04.08 00:21 신고  Address  Edit/Delete  Reply

    내부소스 변경안해도
    MaxRequestLength설정해주시면 됩니다.

  4. 꼰복 2017.04.04 13:25 신고  Address  Edit/Delete  Reply

    와 정말 좋은 소스 감사드립니다! 간단하게 사용할 메신저를 찾고있었는데..이런게 존재하다니요 ㅠㅠ고맙스빈다

  5. 꼰복 2017.04.05 10:05 신고  Address  Edit/Delete  Reply

    안녕하세요! 어제 댓글단 사람입니다! 질문하나 해도 될까요?ㅠㅠ 클라이언트 여러 개를 실행하고, 한개의 클라이언트를 종료했을때, 다른 클라이언트에 접속자 명단에서 종료한 사람이 제거 되지 않아서, 코드를 살펴봤는데요! 처음 클라이언트를 접속하게 되면 클라이언트에서 DataReceive 핸들러가 실행되서 MsgAnalysis 함수의 인자로 insSD_A.DataSend.Command 이 값이 제대로 전달받아오는데, 클라이언트가 종료했을때는 핸들러 자체가 실행되지 않아서 명단에 변화가 없다는 걸 알았습니다! 혹시 왜 그런지 아시나요?ㅠㅠ

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.04.06 03:11 신고  Address  Edit/Delete

      아...
      그러고보니 이 버전에 그 버그 있을겁니다.
      슈퍼소켓용은 해당 버그 수정이 안되있습니다.
      서버에서 클라이언트 끊겼을때 모든 클라이언트에 Logout를 날려주면 됩니다.
      일단 직접 수정해서 사용하시면 됩니다.

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바