라이크유 님이 쓰신 글 :
: 인디로 간단한 메신저를 만들고 있습니다.
:
: 클라이언트에서 서버에 접속을 하면 서버의 Connect 이벤트에서 접속한 클라
: 이언트의 사용자명과 IP 를 하나의 TStringList에 추가 시킵니다.
:
: 이렇게 계속 클라이언트가 접속을 하였다가 접속을 끊게 되면 TStringList 에 Add, Delete 가 되는데 문제는 이 TStringList 를 클라이언트에 보내는것이 문제입니다. 가변길이라 어떻게 보내야 할지 모르겠습니다!!
:
: 또 클라이언트에서 받을때는 어떻게 처리해 주어야 하는건가요?
: 이것때문에 이틀을 삽질 해봤지만... 실패하였습니다.
:
: 제발 좀 알려주세요
:
: rocedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); // 접속시
: var
: List : TList; // AThread(접속자) 를 저장하기 위한 리스트
: Loop : Integer; // 클라이언트 모두에게 메시지 전송을 위한 루프문 변수
: IdpeerThread : TIdPeerThread; // 접속자를 보다 간단히 표시 하기 위해
: testPacket : string;
:
: begin
:
: userList:=TStringList.Create; // 접속시 사용자명 리스트 생성
: AThread.Connection.ReadBuffer(PacketInfo,BufferSize); // 버터를 읽어라
: PacketInfo.userIP := AThread.Connection.Socket.Binding.PeerIP; // 읽은 버퍼에 접속클라이언트 IP를 저장
: userList.Add(PacketInfo.userName+','+PacketInfo.userIP); // 접속된 사용자명과 IP 를 리스트에 저장
: userList.Sort;
: List := IdTCPServer1.Threads.LockList; // 모든 클라이언트에게 전달하기 위해 접속된 클라이언를 리스트로 만든다.
: try
: for Loop := 0 to List.Count-1 do Begin
: IdpeerThread := TIdPeerThread(List.Items[Loop]); // 한개의 클라이언트를 보기 쉽게..
: try
: testPacket:='yoonhome';
: dpeerThread.Connection.WriteBuffer(userList,sizeof(TStringList));
//이렇게 쓰면 전송이 안되는군요.. 가변길이라 그런것 같은데.. 어떻게 바꿔 줘야 할까요?
//==> 위와 같이 쓰면 TStringList의 포인터를 보내는 것이 됩니다.
//==> UserList에 담겨있는 내용을 보내려면 아래와 같이 해보세요.
//==> .WriteBuffer(userList.Text, Length(UserList.Text));
: except
: IdpeerThread.Stop;
: end;
: end;
:
: Finally
: IdTCPServer1.Threads.UnlockList; // 변동을 못하게 햇던 리스트를 풀어 줌
: end;
: end;
:
: 제가 엄청 초보인만큼 쉽게 설명 부탁드려요 ㅜㅜ
|