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 http://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 http://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 http://blog.danggun.net BlogIcon 당근천국 2017.04.06 20:33 신고  Address  Edit/Delete

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

댓글 작성

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

티스토리 툴바