수업시간에 하는 채팅프로그램인데요.
이 소스에서 강퇴기능을 추가하고 싶은데 어떻게 하는지 ....
아무리 생각해도 잘 모르겠습니다.
고수님들 좀 가르쳐 주십시요....
서버.................
Private sckNumber As Long ' 접속한 client 수
Private Sub btnExit_Click()
If sckNumber > 0 Then ' 접속한 client가 있을경우
If vbNo = MsgBox("연결된 client 가 있습니다. 종료하시겠습니까?", vbYesNo, "종료확인") Then
Exit Sub
End If
End If
Unload Me '폼을 닫는다
End Sub
Private Sub btnListen_Click()
On Error GoTo error '에러 발생시 error로 감
If btnListen.Caption = "접속대기" Then 'btnListen버튼의 캡션이 '접속대기'일때
sckNumber = 0
srvSocket(0).LocalPort = 3000
srvSocket(0).Listen 'srvSocket(0)을 수신 대기 상태로 만든다.
AddText "--서버가 켜짐--"
btnListen.Caption = "서버종료"
Exit Sub
Else
If sckNumber > 0 Then '접속된 client가 있을 경우
If vbNo = MsgBox("연결된 client 가 있습니다. 종료하시겠습니까?", vbYesNo, "종료확인") Then
Exit Sub
End If
End If
Unload Me
End If
error:
Dim i As Integer
i = MsgBox("error #" & Str(Err.Number) & "was generated by" & Err.Source & Chr(13) & Err.Description & Chr(13) & "please select a New Port", 64, "error")
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim i As Integer
For i = 1 To sckNumber
If srvSocket(i).State <> sckClosed Then
srvSocket(i).Close '소켓이 닫혀있지 않을 경우 소켓을 닫는다.
End If
Unload srvSocket(i)
Next i
End Sub
Private Sub srvSocket_Close(index As Integer)
Dim strCloseIp As String
strCloseIp = srvSocket(index).RemoteHostIP 'srvSocket(index)의 IP주소를 반환
srvSocket(index).Close ' srvSocket(index)를 닫는다..
Dim i As Integer
For i = 1 To cmbClientList.ListCount '1에서 부터 콤보박스의 리스트의 개수 만큼 반복
If strCloseIp = cmbClientList.List(i) Then '닫힌 소켓의 IP와 콤보박스 리스트와 같을경우
cmbClientList.RemoveItem i '콤보박스에서 그 아이템 i를 제거 한다.
If i > 0 Then
i = i - 1
End If
End If
Next i
AddText Str(index) & "Client가 종료됨"
sendCBlist 'sendCBlist함수로 이동
End Sub
Private Sub srvSocket_ConnectionRequest(index As Integer, ByVal requestID As Long)
If index = 0 Then 'index의 값이 0일 경우
sckNumber = sckNumber + 1 ' sckNumber에 1을 더한다...
Load srvSocket(sckNumber)
srvSocket(sckNumber).LocalPort = 0
srvSocket(sckNumber).Accept requestID
Dim strTmpIp As String
strTmpIp = srvSocket(sckNumber).RemoteHostIP
cmbClientList.AddItem strTmpIp ' 콤보 박스에 연결 요청이 들어온 소켓의 IP를 추가한다.
sendCBlist
End If
AddText "[" & srvSocket(index).RemoteHostIP & "]" & "클라이언트가 접속하였습니다."
End Sub
Private Sub srvSocket_DataArrival(index As Integer, ByVal bytesTotal As Long)
Dim strData As String
Dim i As Integer
Dim j As Integer
Dim juso As String
Dim AAA As String
srvSocket(index).GetData strData
AAA = srvSocket(index).RemoteHostIP '데이터를 보낸 IP의 주소를 AAA에 저장
head = Left(strData, 2) '받은 데이터에서 앞의 2개를 head에 저장
strData = Mid(strData, 3)
Select Case head
Case "TT" 'head가 tt일 경우 즉 전체일 경우
strData = "[" & srvSocket(index).RemoteHostIP & "]" & strData
AddText strData
For i = 1 To sckNumber ' 모든 소켓에 strdata를 보낸다
If i <> index Then
If srvSocket(i).State <> sckClosed Then
DoEvents
srvSocket(i).SendData "TT" & strData 'strData의 앞에 TT를 붙여 보냄
End If
End If
Next i
For id = 1 To sckNumber
If srvSocket(id).RemoteHostIP = juso Then '뽑아낸 IP주소와 해당소켓의 IP가 같을경우
If srvSocket(id).State <> sckClosed Then
srvSocket(id).SendData "TB" & AAA & strData '해당 소켓에 데이터를 보낸다.
End If
End If
Next id
AddText "<" & AAA & ">" & "->" & "<" & juso & ">" & strData '귓속말을 보낼때 어디서 어디로 보내는 것을 서버에 표시함
End Select
End Sub
Private Sub srvSocket_Error(index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox Description, vbOKOnly, Str(index) & "Socket Error"
End Sub
Private Sub txtSendMsg_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then '엔터키를 눌렀을 경우
If sckNumber = 0 Then
MsgBox "접속된 클라이언트가 없습니다.", vbOKOnly, "확인"
Exit Sub
End If
If txtSendMsg.Text = "" Then
MsgBox "내용을 입력하세요", vbOKOnly, "확인"
Exit Sub
End If
Dim strData As String
Dim id As Integer
strData = "[" & srvSocket(0).LocalIP & "]" & "<server>" & txtSendMsg.Text
If cmbClientList.Text = "전체" Then '콤보박스의 텍스트가 "전체"일 경우
For id = 1 To sckNumber '접속한 client 수만큼
If srvSocket(id).State <> sckClosed Then
DoEvents
srvSocket(id).SendData "TT" & strData '각 client에 strData를 보낸다
End If
Next id
Else ' 콤보박스의 텍스트가 전체가 아닐 경우
strData = "<귓속말>" & strData
For id = 1 To sckNumber
If srvSocket(id).RemoteHostIP = cmbClientList.Text Then '해당소켓의 IP와 콤보박스리스트의 텍스트가 같을 경우
If srvSocket(id).State <> sckClosed Then
srvSocket(id).SendData "TB" & strData '그 해당 IP에 strData를 보낸다.
End If
End If
Next id
End If
txtSendMsg.Text = ""
AddText strData
End If
End Sub
Private Sub AddText(strText As String)
txtChat.SelStart = Len(txtChat.Text)
txtChat.SelText = strText & vbCrLf
End Sub
Sub sendCBlist()
Dim i As Integer
Dim j As Integer
Dim A As String
A = "CB"
For i = 1 To sckNumber
If cmbClientList.List(i) <> "" Then
A = A & cmbClientList.List(i) & "CB"
End If
Next i
For i = 1 To sckNumber '접속한 모든 client에
If srvSocket(i).State <> sckClosed Then
DoEvents
srvSocket(i).SendData A
' 모든 소켓에 A라른 데이터를 보낸다.
End If
Next i
End Sub
클라이언트...................
Public strID As String
Public strIP As String
Private sckNumber As Long
Private Sub AddText(strText As String)
txtChat.SelStart = Len(txtChat.Text)
txtChat.SelText = strText & vbCrLf
End Sub
Private Sub btnConnect_Click()
If cltSocket.State = sckClosed Then ' 소켓이 닫혀있을 경우
strID = InputBox("대화명을 입력하세요", "대화명 입력")
strIP = InputBox("server의 IP주소를 입력하세요.", "IP입력")
cltSocket.RemoteHost = strIP
cltSocket.RemotePort = 5000
cltSocket.Connect
btnConnect.Caption = "서버접속해제"
Else
cltSocket.Close
btnConnect.Caption = "서버접속"
End If
End Sub
Private Sub btnExit_Click()
Unload Me
End Sub
Private Sub cltSocket_Close()
AddText "Server가 종료되었습니다." & vbCrLf
cltSocket.Close
End Sub
Private Sub cltSocket_Connect()
AddText "서버에 접속되었습니다."
End Sub
Private Sub cltSocket_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Dim head As String
Dim s_location As Long
Dim add_IP As String
cltSocket.GetData strData 'strData를 받는다
head = Left(strData, 2) ' strData에 앞의 2개를 head에 저장
Select Case head
Case "TT" '전체 '헤드가 TT일 경우
strData = Mid(strData, 3)
AddText strData
Case "CB" ' 콤보박스 추가 '헤드가 CB일 경우
Combo1.Clear '콤보박스를 클리어 한 후
Combo1.Text = "전체"
Combo1.AddItem "전체"
Private Sub cltSocket_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
If cltSocket.State = sckClosed Then
Exit Sub
Else
MsgBox Description, vbOKOnly, "Socket Error"
End If
End Sub
Private Sub txtSendMsg_KeyPress(KeyAscii As Integer)
Dim strData As String
Dim strData1 As String
If KeyAscii = vbKeyReturn Then '엔터키를 눌렀을 경우
If cltSocket.State = sckClosed Then '소켓이 닫혀있다면
MsgBox "접속된 상태가 아닙니다.", vbOKOnly, "확인"
Exit Sub
End If
Dim id As Integer
strData = "<" & strID & ">" & txtSendMsg.Text
If Combo1.Text = "전체" Then '콤보박스의 내용이 "전체"일 경우
cltSocket.SendData "TT" & strData ' strData의 내용에 "TT"를 붙인다
Else '콤보박스의 내용이 전체가 아닐경우
strData1 = "<귓속말>" & Combo1.Text & " " & strData
cltSocket.SendData "TB" & strData1 'strData1의 앞에 TB를 붙여 보냄
strData = "<귓속말>" & strData
End If
txtSendMsg.Text = ""
AddText strData
End If
End Sub
첫댓글 여러가지 방법이 있겠지만, 쉽게 생각해보자면..... 귓속말인지 아닌지를 TB,TT 이냐로 구별한 것 처럼 헤더에 구별자를 넣어서 강퇴를 시키면 될 것 같은데요... 당연히 강퇴시킬 IP를 뒤에 붙여줘야하구요....
좀 더 자세히 설명해주시면 고맙겠습니다.