인디로 간단한 메신저를 만들고 있습니다.
클라이언트에서 서버에 접속을 하면 서버의 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)); //이렇게 쓰면 전송이 안되는군요.. 가변길이라 그런것 같은데.. 어떻게 바꿔 줘야 할까요?
except
IdpeerThread.Stop;
end;
end;
Finally
IdTCPServer1.Threads.UnlockList; // 변동을 못하게 햇던 리스트를 풀어 줌
end;
end;
제가 엄청 초보인만큼 쉽게 설명 부탁드려요 ㅜㅜ
|