⦁ TCP클라이언트 | 서버 구성
클라이언트
Imports System.Net
Imports System.Text.Unicode
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'tcp연결을 한다.
'포트넘버사용시 주의점 : 이미 사용중인 포트넘버를 사용하면 안된다.
'내가현재 어떤 포트를 사용하고 있는지 확인하는 방법은
'cmd => netstat -n입력 하면 로컬 주소에 맨 마지막 번호가 포트넘버이다.
'혹시 1300번을 사용하는지 cmd에서 확인하고 싶으면
'netstat -n | find "13000"입력한뒤에 아무것도 안나오면 사용안함
'Net.Sockets.TcpClient("접속하곳의 주소", "포트넘버")
'127.0.0.1 로컬호스트 주소
Dim client As New Net.Sockets.TcpClient("127.0.0.1", 13000) 'TCP연결완료
'TCP통신에서 사용하는 네트워크를 통한 데이터를 활용할 수있는 함수가 제공되는데
'netWorkStream이라는 곳에 담겨있다.
'GetStream() 네트워크 스트림 형태의 데이터를 반환한다.
'Dim networkStream As Sockets.NetworkStream = client.GetStream()
Dim networkStream As Sockets.NetworkStream = client.GetStream()
'아래와 같이
'networkStream.Write, networkStream.Read() 매서드를 사용함으로써
'TCP의 규정을 일일이 맞춰서 데이터를 구축하지 않아도 된다.
Dim sentence As String = "Hello VB"
'String 문자열을 바이트배열로 인코딩해서 넣어줌
Dim data As Byte() = System.Text.Encoding.Default.GetBytes(sentence)
'networkStream.Write("보내고 싶은 데이터", "데이터의 몇번째부터 보낼건지", "어디까지")
networkStream.Write(data, 0, data.Length)
Debug.WriteLine("전송문구 : " & sentence)
'중요!
'*****두개다 사용했으면 항상 닫아야 한다.*****
networkStream.Close()
client.Close()
End Sub
End Class
서버
Imports System
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
Dim server As TcpListener
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'데이터 받기
'TcpListener에서 아이피주소 String 형태로 못받음
' 따라서 IPAddress 클래스에서 String 문자열을 ip주소로 바꿔줘야함.
Dim localAddress As IPAddress = IPAddress.Parse("127.0.0.1")
server = New TcpListener(localAddress, 13000)
'위에 2개를 만들면 tcp리스너를 만든것인데 이걸 만들었다고 바로 동작하지 않는다
'준비만 한 상태이다.
'동작 스위치를 켜줘야한다.
'server.Start() 후 부터 server.Stop()할때 까지
'데이터들이 큐에 적재되어 대기하기 시작한다.
'또 server.Start(20) 큐에 20만큼 데이터가 차면 그이상 안받는다.
server.Start()
Debug.WriteLine("서버가 시작했습니다.")
'server.AcceptTcpClient()
'보류중인 큐에 대기중인 요청을 수락하는데
'반환값이 TcpClient이다.
'따라서 아래와 같이 사용한다.
'Dim client As TcpClient = server.AcceptTcpClient()
'아래 매서드 2개는 비슷하다.
'요청이 끝난후 새로운 데이터가 큐에 쌓여서 대기상태가 되면
'여기서 멈춘다.
'Dim client As TcpClient = server.AcceptTcpClient()
'client.GetStream().Read()
'Dim client As TcpClient = server.AcceptTcpClient()
'만약 위에서 멈추게 되면 난감한데
'server.Pending() 해결할수 있다.
'연결이 보류 중이면 true, 아니면 false이다.
' 위와 같이되면 서버 스타트 부터 펜딩까지 시간에 들어온 요청만 받게된다.
' 해결방안
' 1. 서버시작 버튼과 페딩버튼을 나누어서 해결
' 2. 아래 팬딩 if문을 무한 루프로 계속 데이터를 받을 수있게 함
' 예제는 2번
' 아래와 같이 하면 무한루프때문에 UI먹통,
' OS단에서 버그로 판단해 자동으로 프로그램 종료를 해버린다.
' 버튼을 2개 만들자
'While True
' If server.Pending() Then
' '연결 보류중이면
' Dim client As TcpClient = server.AcceptTcpClient()
' Debug.WriteLine("클라이언트가 접속했습니다.")
' Exit While
' Else
' '아니면
' End If
'End While
'server.Stop()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'Try
' If server.Pending() = Nothing Then
' MsgBox("서버시작부터 눌러주세요")
' Return
' End If
'Catch ex As System.NullReferenceException
' MsgBox("서버시작부터 눌러주세요")
' Return
'End Try
If server.Pending() Then
'연결 보류중이면
Dim client As TcpClient = server.AcceptTcpClient()
Debug.WriteLine("클라이언트가 접속했습니다.")
server.Stop()
Else
'아니면
End If
End Sub
End Class