SocketAsync Chatting 0.83.5 - 'SocketAsyncEventArgs'를 이용한 Client/Server 

 

SocketAsync_Chatting_Publish_20160217.zip

 

 

 

Author  : Dang-Gun Roleeyas ( http://blog.danggun.net/ )
Create date : 2015.06.14
License  : BSD ( The BSD 2-Clause License )

 

'SocketAsyncEventArgs'를 이용한 채팅(Chatting) Client/Server 예제입니다.

'SocketAsyncEventArgs'를 이해하고 사용하는데 목적이 있어 다중 유저 처리가 부실합니다.

 

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

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

 

 

1. 주요기능

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

- 파일, 큰 메시지와 같은 큰 데이터(Large data) 전송

- 리스트 전송

- 연속 전송(예> 반복문에서 'send'를 하는 경우)

 

 

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

 

 

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

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

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

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

 

 

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

참고 : [.Net] 'SocketAsyncEventArgs'에서 큰 데이터(Large Data) 전송할때 생기는 문제

 

큰 데이터를 'SocketAsyncEventArgs'에 한번에 보낸후 리시브데이터를 합쳐 원본 데이터를 완성시키는 방법을 사용합니다.

 

 

3. 수정 이력

 

2016.02.17 - 0.83.5

 

SocketAsync_Chatting_Publish_20160217.zip

 

- 소켓 처리 부분 재설계

- 소켓 처리를 재설계하면서 메시지 한번에 여러번 보내도 처리되도록 수정 되었습니다.

 

2016.02.14 - 0.83.2

SocketAsync_Chatting_Publish_20160214.zip

 

- 공통코드 분리

- 중복코드 합치기

- 클라이언트 인터페이스 수정(다른 곳에 응용이 쉽도록 변경함)

- 작은 데이터(4byte 이하)를 받을때 발생하는 예외 처리

- 리스트 주고받기 기능 추가

 

2015.11.12.

SocketAsync_Chatting_20151112.zip

 

- 일부 코드 정리

- 서버 -> 클라이언트로 대용양 메시지 전송 기능 추가

 

2015.11.05.

SocketAsync_Chatting_20151105.zip

 

- 메시지 전송 관련 클래스 캡슐화

2015.06.14.

SocketAsync_Chatting_20150614.zip

 

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

- 큰메시지(파일 포함) 전송 추가(서버로만 전송 가능)

 

2014.09.18.

- 예제 개발 완료

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

 

 

 

  1. 꼰복 2017.04.06 11:25  Address  Edit/Delete  Reply

    삭제 처리가 가능한 수정본 채팅프로그램이 있었군요! ㅠㅠ
    이 전에 비동기식, 슈퍼소켓식 모두 다운받아서, 유저가 종료했을 시에 Logout 명령을 보내도록 수정하려고 해도 제대로 되지 않아서 고민하던 중에 다시 이걸 발견하게 되었네요 ㅠㅠ 두 코드 모두 유저가 종료했을 때 서버에서 메시지를 보내도록 코딩이 되어 있는대도 가지 않는 버그를 제가 잡아보려했지만..초보인 저로선 힘들더군요..ㅠㅠ
    정말 대단하십니다!!

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2017.04.06 12:42 신고  Address  Edit/Delete

      이 버전은 해당 버그가 수정된 버전입니다.
      혹시나 해서 받아서 해보니 잘됩니다.

      지금보니 Logout는 형식상 전송하는 것이고 클라이언트가 끊기면 User_Disonnect명령이 날아가서 유저리스트에서 지웁니다.
      오래된 코드라 잘못 기억하고 있었네요 ㅎㅎㅎ

  2. 꼰복 2017.04.06 13:16  Address  Edit/Delete  Reply

    네! 저도 User_Disconnect 명령을 날려주려고 로그인할때, 메시지 송수신될때 모두 함수 타고 들어가면서 똑같이 세팅을 하려고 했지만..결국 실패했습니다.ㅠㅠ
    제일 최신 2/14, 2/17은 안에 내재되어 있는 DUP? 새롭게 추가된 프로젝트들이 로드가 되지 않아 사용못했고 20151112 버전을 사용하니깐 딱 좋네요!
    필요에 따라 약간 수정해서 사용하니 문제도 없고 잘 됩니다! 너무나 고맙습니다! 대단하십니다 정말!

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2017.04.06 17:12 신고  Address  Edit/Delete

      이게 왜그런지 모르겠는데.....
      가끔 솔루션에 멀쩡하게 들어있는 프로젝트 참조가 깨지는 경우가 있습니다.
      저도 받아보니 그 현상 또일어났는데요...
      이거 기존 참조 지우고 다시 참조해주시면 동작합니다.

  3. 꼰복 2017.04.06 17:44  Address  Edit/Delete  Reply

    계속 댓글써서 죄송합니다..ㅠㅠ20151112 버전으로 테스트하고 있는데, 클라이언트를 다른 pc에서 켜서 접속하게 되면 buffer 메모리 초과가 되네요..ㅠ.ㅠ byte배열의 최대 맥스가 255인데, 클라이언트로 들어오는 크기는 71298123 이런식으로 6~7자리가 들어와 버립니다..ㅠ.ㅠ혹시 아셨나용?ㅠㅠ

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2017.04.06 20:33 신고  Address  Edit/Delete

      과거버전 버그는......최신버전쓰시면 됩니다.
      ㅎㅎㅎㅎ
      그런 버그가 있던걸로 기억합니다.
      특히 클라이언트를 강제로 끊을때 자주 발생했던거 같은데.....
      이후 버전에서는 패킷관련 클래스 자체를 대폭수정해서 겸사겸사 해결되었습니다.

댓글 작성

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