초간단! C#으로 TCP/IP 통신하는법!! ( 1 )

Date
2009/03/31 00:07
Author
ApPLe
Categories
읽기전에 ,
이 글은 정식으로 공부해서 쓰는것이 아니라, 지극히 주관적인 개발경험에 의해 쓰는글이므로 ,
이것보다 훨씬 더 좋은방법이 많을수 있습니다!
"참고" 용으로 사용하시기 바랍니다.

C#은 참 간단하다.
뭐든지 뚝딱뚝딱.
그렇다고 C++ / MFC처럼 복잡한것도아니고 ,
VB처럼 쉽지만 코드가 병맛이 되는것도 아니고 ....
참 MS에서 요로코롬 잘 맹글어 놓은 언어인것같당!

이번에는 C#에서 참 ! 쉽게 , TCP/IP 소켓프로그래밍을 해보장 =_=
C#왕초보인 내가 사용경험에 의해 쓰는 글이므로 , 초보분들이 보시면 도움이 되겠다.

※읽으면 좋은 0순위 : VB에서는 소켓프로그래밍 참잘했는데 C#에서는 막막한 분.

맨처음 소켓프로그래밍을 시작하려면 , 네임스페이스를 지정해주자.
소켓관련 네임스페이스는

using System.Net;
using System.Net.Sockets;

이것 둘 뿐이다
이 네임스페이스들안에는 Socket 클래스 , IPEndPoint 클래스등 ..
여러 클래스들이 있다 .

자 !! 거두절미하고 !! ( 다들 서문이 긴건 싫어하실듯 ㅋ_ㅋ )

일단 서버를 만들어보자.

Socket server = new Socket ( AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp );

=_= 간단하게 TCP 소켓 인스턴스가 하나생성되었다.
이놈을 초기화시켜주자.

IPEndPoint ipep = new IPEndPoint ( IPAddress.Any , 8088 );
server.Bind ( ipep );
server.Listen ( 10 );
MessageBox.Show ( "Connection request!!" );

끝이다. 너무 간단한가 ?
이 몇줄 안되는 구문으로 , 8088포트로 TCP프로토콜을 이용하여 스트림을 수신할수 있는
서버가 만들어진것이다;;

그러나!! 이건 중요하다. 잘보시길.
지금서버를 연 방식은 동기소켓 ( Sync socket ) 이다.
더욱 간단하게 말해 , 저 코드에서 클라이언트가 8088포트로 접속하기 전에는 죽어도 server.Listen ( 10 ); 밑 라인의 MessageBox가 뜨지 않는다는 말이다.
계속 Listen 메서드가 실행되면서 접속을 기다릴뿐 ....

어 ? 그러면 지장이있다.
예를들어 메인 폼에서 Load 이벤트가 발생하는곳에 저 코드를 넣었다고 가정해보자.
.... 클라이언트가 접속하기전까지는 폼이 뜨지도 않을것이다.

그래서 ... 대안인 쓰레드를 쓰는것이다!!!!
메인 쓰레드와 다른 또 다른 서버 쓰레드를 돌려서 , 저 코드를 돌리는것이다.
그러면 해결된다 .
( 쓰레드가 싫은 사람은 비동기소켓 ( Async socket ) 을 이용하시길 ..비동기소켓은 Event-Driven 방식을 이용한당. VB에서의 Winsock컨트롤과 똑같다고 보시면 된다. )

자 그럼 .. 저 코드에서 클라이언트가 접속한다고 가정해보자.
서버는 접속승인을 할것이고 , 클라이언트는 접속을 할것이다.
그럼 코드로는 다음과 같이 된다.

Socket client = server.Accept ();

... 한줄의 코드로 클라이언트가 접속되었다 =_=..
그리고 상세히 설명하자면 : 클라이언트의 데이터를 바탕으로 또 다른 소켓 인스턴스를 생성한다.
이제 저놈을 가지고 데이터를 보내고 이리저리 요리하면 되는것이다.
( ... 이쯤되면 VB에서 Winsock으로 소켓프로그래밍 하시던 분들은 삘이 오실것이다 )

자,, 그럼 이제 클라이언트가 데이터를 보내는걸 받아보자.
클라이언트가 접속했을때 생성된 소켓 인스턴스를 이용한다.
데이터를 받을 바이트배열이 필요하다.

byte[] buf = new byte[1024];
client.Receive ( buf );

MessageBox.Show ( Encoding.Default.GetString ( buf ) );

... 끝. =_=
데이터를 1024짜리 바이트배열에 받아서 ( 참고로 오버로딩된 메서드를 뒤져보면 원하는 크기만큼 스트림에서 땡겨올수있다 =_= 그건 찾아보시길 ㅋ_ㅋ ) byte배열에 저장된 스트림 데이터를 string으로 변환해서 찍어주었다.

코드를 보면 이해가 팍팍가지 않는가 ??;
정말 간결한 C#이다 .... =_=;

자 , 그럼 , 클라이언트에게 데이터를 보내볼까?
당연히 아까 생성된 client 소켓 인스턴스를 이용한다.
보낼대는 byte배열에 보낼내용을 채워넣은다음 보내면 된다.
byte배열 buf에 보낼 내용이 들어있다고 가정하자.

client.Send ( buf );

..끝이다.. =_=
허무한가 ?
그런데 정적소켓방식에서는 정말 이게 다다 ..;;

예외처리는 어떻게 할까?
try ~ catch로 묶어주고 , 예외처리 클래스는 무엇이 올까?
C#을 만지신 분들은 빡 감이 올것이다

try
{
  client.Send ( buf );
}
catch ( SocketException se )
{
   MessageBox.Show ( se.Message );
   return;
}

뭐.. 이런식으로 해주면 된다 =_=;
저 코드에서 데이터를 보내려하는데 연결이 끊겨있으면 에러메시지가 출력되고
메서드가 종료될것이다.
참으로 간단하다 허허 ..;;

여기까지가 C# TCP/IP 동기소켓에서 서버 만드는법이다 .
( SingleServer - SingleClient 모델이지만 .. ㅜㅜ )

엄청쉬울것이다 =_=;;


클라이언트는 다음포스팅에!!
아디오스!!
ApPLe
2009/03/31 00:07 2009/03/31 00:07
Tag
Trackback
Comments
1