본문 바로가기
C#

[C#][JAVA]C# 클라이언트 JAVA 서버 간 TCP/IP Socket 데이터 통신

by teamnova 2021. 6. 21.

안녕하세요. 이번에는 C# 클라이언트 JAVA 서버를 이용해서 서로 TCP 데이터 TCP/IP Socket 통신을 하는 것에 대해 알아보겠습니다.

통신 방법을 알아보기 전에 TCP TCP/IP Socket 통신이란 무엇인지부터 알아봐야겠죠?

 

TCP/IP Socket

 

TCP/IP <

이는 인터넷 표준 프로토콜로서 컴퓨터 간의 주고받는 데이터를 전송할 때 에러가 발생하지 않도록 알맞게 나누어 전송하고 이를 수신하여 다시 기존의 정보로 변환하는 것을 약속해 놓은 것을 말합니다.

인터넷 프로토콜 중 가장 중요한 역할을 하는 TCP와 IP의 합성어로 데이터의 흐름 관리, 정확성 확인, 패킷의 목적지 보장을 담당합니다. 데이터의 정확성 확인은 TCP가, 패킷을 목적지까지의 전송은 IP가 담당하게 됩니다.

 

 

 

Socket

-클라이언트와 서버는 각각 자신의 포트를 이용해서 통신합니다. 포트 사이의 연결을 위해선 소켓을 이용해야 하는데, 여기에서 소켓이란 TCP/IP를 이용하는 통로 역할이라고 볼 수  있습니다.

- 양쪽 소켓이 서로 연결되면 서로 다른 프로세스끼리의 데이터 전달이 가능해집니다.

 

 

TCP/IP Socket에 대해 간단히 알아보았고 다음으로 이번 포스팅에서 해볼 것 중에 하나인 C# 클라이언트 구성에 대해 알아보겠습니다.

마이크로 소프트 개발자 홈페이지를 먼저 확인해보겠습니다.

docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient?view=net-5.0

 
TcpClient 클래스 (System.Net.Sockets)TCP 네트워크 서비스에 대한 클라이언트 연결을 제공합니다.docs.microsoft.com

 

TcpClient 연결하고 데이터를 교환하기 위해, TcpListener , 소켓은 TCP로 만든 ProtocolType이 들어오는 연결 요청을 수신해야 합니다 원격 호스트의 호스트 이름 및 포트 번호를 사용하여 Tcp Client를 생성합니다. 이 생성자는 자동으로 연결을 시도합니다.

데이터를 보내고 받으려면 GetStream() 메서드를 사용하여 NetworkStream 을가져 옵니다 . NetworkStream 의 Write (Byte [], Int32, Int32) 및 Read (Byte [], Int32, Int32) 메서드를 호출하여 원격 호스트와 데이터를 보내고 받습니다. 

 

다음으로 JAVA 서버 구성에 대해 알아보겠습니다.docs.oracle.com/javase/tutorial/networking/overview/networking.html

 

Networking Basics (The Java™ Tutorials > Custom Networking > Overview of Networking)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

자바 개발자 홈페이지에선 코드 대신 네트워크 개요를 알려주네요. 스틱코드에서 JAVA 네트워크에 대한 예제를 찾아보겠습니다.

stickode.com/detail.html?no=2135

 

스틱코드

 

stickode.com

잘 만들어져 있는 예제가 있네요!

이제 이 두 가지 예제를 이용해서 TCP/IP Socket통신을 진행할 건데요. 그전에 TCP/IP Socket 통신의 구조에 대해 보자면.

 

대략 이런 식으로 진행하게 됩니다.  코드로 넘어가서 저 구조가 코드로 어떻게 구성되는지 살펴보겠습니다.

 

우선 자바 서버부터 구성해 보겠습니다.

전체적인 서버의 구조를 만들고 클라이언트에게 연결 요청이 왔을 때 연결을 받을 준비를 합니다.

클라이언트 부분은 독립적으로 움직일 수 있도록 스레드를 상속받아 구성하였습니다.

연결된 클라이언트가 보낸 메시지를 byte 배열에 담아 읽어 들인 후 디코딩하여 Brodcast 메서드로 넘겨줍니다.

현재 연결된 모든 client에게 메시지를 인코딩하여 보내 줍니다.

 

클라이언트 연결이 종료되면 처리할 부분도 따로 메서드로 만들어서 서버를 원활하게 운영하기 좋게 만들어 줍니다.

 

여기까지가 JAVA로 구성된 서버였습니다. 처음 보시면 복잡해 보일 수도 있지만 구조를 이해하고 보면 그리 어렵지 않습니다!

 

다음으로 C#으로 만든 Client의 코드 구성도 살펴보겠습니다!

 

C#으로 만들어진 Client 코드입니다. 서버 연결 후 메시지를 보낸 후 서버에서 리턴해준 메시지를 다시 받으면 콘솔창에 메세지를 띄운 후 종료되는 프로그램의 코드입니다. 

서버 쪽 프로그램에 비해 간단하게 구현할 수 있네요!

 

그대로 구현하셨다면 결과는 이렇게 나오게 됩니다.

서버 동작 예.

클라이언트 동작 예.

 

결과가 이렇게 나왔다면 성공적으로 서로 데이터를 주고받은 것입니다!

 

이걸 응용하면 채팅이나 다른 네트워크 통신을 이용한 다른 것들을 만들어 낼 수 있겠죠??

TCP/IP Socket 통신 포스팅은 여기까지 입니다!

 

 

'C#' 카테고리의 다른 글

[C#][Unity] On Click()에 대해서.  (0) 2021.08.23
[C#][Unity] 로딩 화면 만들기  (0) 2021.08.15
[C#][Unity]타이머 만들기!  (0) 2021.08.12
[C#][Unity] 싱글톤 패턴(Singleton) 설명  (0) 2021.07.26
[C#][Unity] 유니티 생명주기  (0) 2021.07.11