Q&A

  • [Socket]Server에 접속한 Client 처리하기
고수님들의 도움이 필요합니다.



질문의 요지는 다음과 같습니다.



질문1) Server Socket 에 접속한 Client를 보여주는방법과

Client Address를 알아서 Client가 보낸 메세지 처리결과를

해당 Client에만 전하는 방법을 알고 싶습니다.



----------- ---------- --------------

| | ---------------->|Middle |--------------->| |

|Client(N)| Send Msg |Server | Send Msg | Main Server|

| | <----------------| |<---------------| |

| | Send Msg | | Send Msg | |

----------- ---------- --------------



대략적인 시스템 개요 입니다.

여기서 Client가 여러개 접속하면 제가 알기로는 특정 Client에만

Msg를 보낼수 없다고 알고 있어

고수님들이 도움이 필요합니다.

초보자의 어려움을 해결해주세요



3  COMMENTS
  • Profile
    임형호 2000.09.02 13:42
    저두 이것때문에 미치는줄 알았습니다.

    해당 client ip로만 메세지를 보낼수 있다면 좋으련만...델파이에서 제공하는 socket 으로는 안되는것 같더라구요.

    그런데 해당 클라이언트socket으로 메세지를 보낼수는 있습니다.



    serversocket1.Socket.Connections[index:integer].sendtext.....



    위문장에서 connections[]안에 들어가는 순서가 서버로 접속한 클라이언트의 순서이거든요. 그러니까 서버에서 접속한 클라이언트의 접속ip등의 자료를 listbox등에 가지고 있으면 listbox의 itemindex와 안에 들어가는 index를 맞추면 되거든요.

    단 listbox에 출력되는 자료는 해당 클라이언트가 종료될때에도 같이 삭제를 해주어야합니다. 좀 번거롭죠...

    암튼...제 나름대로 해본방법이니까요. 그냥 흘려들으셔도 됩니다.

    그렇게 해서 제가 서버로 여러클라이언트가 접속해서 클라이언트에서 해당 클라이언트로 메세지를 보내봤는데 잘 되었습니다.

    그런데 문제는 여러클라이언트중에서 어느한 클라이언트가 비정상 종료가 되는경우였거든요. 그럼... 서버에서 이것이 종료가 되었는지 어쩐지를 판단을 못하더라구요.

    그래서 서버에 있는 클라이언트 접속 항목이 틀어지기 시작하면서 메세지가 어먼데로 날아가고 심지어는 에러까장... ㅠ.ㅠ

    아마 이곳 질문란에 socket 컴포넌트 사용시 클라이언트의 비정상 종료처리에 대한 질문이 여러번 나온걸로 알고 있는데요. 답변을 찾지는 못했습니다.

    저두 답답해서 글을 남기는겁니다. 답변은 아니고요. 혹 해결책을 찾으시면 저두 알켜주십시요. 제 질문을 올려놓는것 같아서 죄송합니다. 그럼...









    푸우 wrote:

    > 고수님들의 도움이 필요합니다.

    >

    > 질문의 요지는 다음과 같습니다.

    >

    > 질문1) Server Socket 에 접속한 Client를 보여주는방법과

    > Client Address를 알아서 Client가 보낸 메세지 처리결과를

    > 해당 Client에만 전하는 방법을 알고 싶습니다.

    >

    > ----------- ---------- --------------

    > | | ---------------->|Middle |--------------->| |

    > |Client(N)| Send Msg |Server | Send Msg | Main Server|

    > | | <----------------| |<---------------| |

    > | | Send Msg | | Send Msg | |

    > ----------- ---------- --------------

    >

    > 대략적인 시스템 개요 입니다.

    > 여기서 Client가 여러개 접속하면 제가 알기로는 특정 Client에만

    > Msg를 보낼수 없다고 알고 있어

    > 고수님들이 도움이 필요합니다.

    > 초보자의 어려움을 해결해주세요

    >

  • Profile
    이화 2000.09.02 19:36
    서버 소켓에는 OnClientError 이라는 이벤트가 있습니다..



    클라이언트에서 에러가 발생 되면 처리 되는 이벤트이지요..



    도움말에서 찾아 보면 여러가지 에러에 대한 값이 존재 합니다..



    비정상 종료인 경우 ErrorEvent의 값이 eeDisconnect가 됩니다.



    처리 루틴을 만들려면

    if ErrorEvent = eeDisconnect then

    begin



    ErrorCode := 0; // OS에 에러 메시지를 띄우지 않음...

    end;

    이러한 식으로 코딩 하면 될것 같네요..



    ErrorCode를 해 주지 많으면 os에서 에러 메시지를 발생 시키게 됩니다..



    델파이의 예외 처리 (Try) 문과 비슷하다고 보면 됩니다..



    많은 도움이 되었는지 궁금하네요?



    그럼...20000





    임형호 wrote:

    > 저두 이것때문에 미치는줄 알았습니다.

    > 해당 client ip로만 메세지를 보낼수 있다면 좋으련만...델파이에서 제공하는 socket 으로는 안되는것 같더라구요.

    > 그런데 해당 클라이언트socket으로 메세지를 보낼수는 있습니다.

    >

    > serversocket1.Socket.Connections[index:integer].sendtext.....

    >

    > 위문장에서 connections[]안에 들어가는 순서가 서버로 접속한 클라이언트의 순서이거든요. 그러니까 서버에서 접속한 클라이언트의 접속ip등의 자료를 listbox등에 가지고 있으면 listbox의 itemindex와 안에 들어가는 index를 맞추면 되거든요.

    > 단 listbox에 출력되는 자료는 해당 클라이언트가 종료될때에도 같이 삭제를 해주어야합니다. 좀 번거롭죠...

    > 암튼...제 나름대로 해본방법이니까요. 그냥 흘려들으셔도 됩니다.

    > 그렇게 해서 제가 서버로 여러클라이언트가 접속해서 클라이언트에서 해당 클라이언트로 메세지를 보내봤는데 잘 되었습니다.

    > 그런데 문제는 여러클라이언트중에서 어느한 클라이언트가 비정상 종료가 되는경우였거든요. 그럼... 서버에서 이것이 종료가 되었는지 어쩐지를 판단을 못하더라구요.

    > 그래서 서버에 있는 클라이언트 접속 항목이 틀어지기 시작하면서 메세지가 어먼데로 날아가고 심지어는 에러까장... ㅠ.ㅠ

    > 아마 이곳 질문란에 socket 컴포넌트 사용시 클라이언트의 비정상 종료처리에 대한 질문이 여러번 나온걸로 알고 있는데요. 답변을 찾지는 못했습니다.

    > 저두 답답해서 글을 남기는겁니다. 답변은 아니고요. 혹 해결책을 찾으시면 저두 알켜주십시요. 제 질문을 올려놓는것 같아서 죄송합니다. 그럼...

    >

    >

    >

    >

    > 푸우 wrote:

    > > 고수님들의 도움이 필요합니다.

    > >

    > > 질문의 요지는 다음과 같습니다.

    > >

    > > 질문1) Server Socket 에 접속한 Client를 보여주는방법과

    > > Client Address를 알아서 Client가 보낸 메세지 처리결과를

    > > 해당 Client에만 전하는 방법을 알고 싶습니다.

    > >

    > > ----------- ---------- --------------

    > > | | ---------------->|Middle |--------------->| |

    > > |Client(N)| Send Msg |Server | Send Msg | Main Server|

    > > | | <----------------| |<---------------| |

    > > | | Send Msg | | Send Msg | |

    > > ----------- ---------- --------------

    > >

    > > 대략적인 시스템 개요 입니다.

    > > 여기서 Client가 여러개 접속하면 제가 알기로는 특정 Client에만

    > > Msg를 보낼수 없다고 알고 있어

    > > 고수님들이 도움이 필요합니다.

    > > 초보자의 어려움을 해결해주세요

    > >

  • Profile
    김상호 2000.09.06 08:25
    이런 방법도 있지 않을 까요



    클라이언트가 접속이 되면 접속한 클라이언트의 IP를 알수 가 있거든요.. 이아이피를 기억하고 있다가 보낼 메시지가 있다면 이 아이피를 참고로 해서 보내면 ... 다른 클라이언트가 비정상적으로 종료해도 메시지가 제대로 원하는 클라이언트에 전송이 돼더라고요...



    제가 겜방 관리프로그램에서 사용했던 방법이거든요....







    이화 wrote:

    > 서버 소켓에는 OnClientError 이라는 이벤트가 있습니다..

    >

    > 클라이언트에서 에러가 발생 되면 처리 되는 이벤트이지요..

    >

    > 도움말에서 찾아 보면 여러가지 에러에 대한 값이 존재 합니다..

    >

    > 비정상 종료인 경우 ErrorEvent의 값이 eeDisconnect가 됩니다.

    >

    > 처리 루틴을 만들려면

    > if ErrorEvent = eeDisconnect then

    > begin

    >

    > ErrorCode := 0; // OS에 에러 메시지를 띄우지 않음...

    > end;

    > 이러한 식으로 코딩 하면 될것 같네요..

    >

    > ErrorCode를 해 주지 많으면 os에서 에러 메시지를 발생 시키게 됩니다..

    >

    > 델파이의 예외 처리 (Try) 문과 비슷하다고 보면 됩니다..

    >

    > 많은 도움이 되었는지 궁금하네요?

    >

    > 그럼...20000

    >

    >

    > 임형호 wrote:

    > > 저두 이것때문에 미치는줄 알았습니다.

    > > 해당 client ip로만 메세지를 보낼수 있다면 좋으련만...델파이에서 제공하는 socket 으로는 안되는것 같더라구요.

    > > 그런데 해당 클라이언트socket으로 메세지를 보낼수는 있습니다.

    > >

    > > serversocket1.Socket.Connections[index:integer].sendtext.....

    > >

    > > 위문장에서 connections[]안에 들어가는 순서가 서버로 접속한 클라이언트의 순서이거든요. 그러니까 서버에서 접속한 클라이언트의 접속ip등의 자료를 listbox등에 가지고 있으면 listbox의 itemindex와 안에 들어가는 index를 맞추면 되거든요.

    > > 단 listbox에 출력되는 자료는 해당 클라이언트가 종료될때에도 같이 삭제를 해주어야합니다. 좀 번거롭죠...

    > > 암튼...제 나름대로 해본방법이니까요. 그냥 흘려들으셔도 됩니다.

    > > 그렇게 해서 제가 서버로 여러클라이언트가 접속해서 클라이언트에서 해당 클라이언트로 메세지를 보내봤는데 잘 되었습니다.

    > > 그런데 문제는 여러클라이언트중에서 어느한 클라이언트가 비정상 종료가 되는경우였거든요. 그럼... 서버에서 이것이 종료가 되었는지 어쩐지를 판단을 못하더라구요.

    > > 그래서 서버에 있는 클라이언트 접속 항목이 틀어지기 시작하면서 메세지가 어먼데로 날아가고 심지어는 에러까장... ㅠ.ㅠ

    > > 아마 이곳 질문란에 socket 컴포넌트 사용시 클라이언트의 비정상 종료처리에 대한 질문이 여러번 나온걸로 알고 있는데요. 답변을 찾지는 못했습니다.

    > > 저두 답답해서 글을 남기는겁니다. 답변은 아니고요. 혹 해결책을 찾으시면 저두 알켜주십시요. 제 질문을 올려놓는것 같아서 죄송합니다. 그럼...

    > >

    > >

    > >

    > >

    > > 푸우 wrote:

    > > > 고수님들의 도움이 필요합니다.

    > > >

    > > > 질문의 요지는 다음과 같습니다.

    > > >

    > > > 질문1) Server Socket 에 접속한 Client를 보여주는방법과

    > > > Client Address를 알아서 Client가 보낸 메세지 처리결과를

    > > > 해당 Client에만 전하는 방법을 알고 싶습니다.

    > > >

    > > > ----------- ---------- --------------

    > > > | | ---------------->|Middle |--------------->| |

    > > > |Client(N)| Send Msg |Server | Send Msg | Main Server|

    > > > | | <----------------| |<---------------| |

    > > > | | Send Msg | | Send Msg | |

    > > > ----------- ---------- --------------

    > > >

    > > > 대략적인 시스템 개요 입니다.

    > > > 여기서 Client가 여러개 접속하면 제가 알기로는 특정 Client에만

    > > > Msg를 보낼수 없다고 알고 있어

    > > > 고수님들이 도움이 필요합니다.

    > > > 초보자의 어려움을 해결해주세요

    > > >