방법: 소켓 사용
업데이트: 2007년 11월
.NET Compact Framework에서는 소켓 기반 네트워크 통신을 지원합니다. .NET Compact Framework에서의 소켓 프로그래밍에 대한 고려 사항은 소켓 프로그래밍을 참조하십시오.
이 예제에서는 서버 응용 프로그램의 인스턴스와 클라이언트 응용 프로그램의 인스턴스를 만든 후 두 응용 프로그램이 소켓 기반 연결을 통해 통신하는 방법을 보여 줍니다. 서버에는 로컬 호스트 주소가 사용되므로 두 응용 프로그램 모두 클라이언트에서 실행됩니다. 서버의 인스턴스는 클라이언트가 서버와 통신하기 전에 실행되어야 합니다.
소켓 연결을 통해 통신하려면
Form을 구현하는 Server라는 클래스를 만들고 이 클래스에 다음 코드를 추가합니다.
Private Shared output As String = "" Public Sub New() End Sub Public Sub createListener() ' Create an instance of the TcpListener class. Dim tcpListener As TcpListener = Nothing Dim ipAddress As IPAddress = Dns.GetHostEntry("localhost").AddressList(0) Try ' Set the listener on the local IP address. ' and specify the port. tcpListener = New TcpListener(ipAddress, 13) tcpListener.Start() output = "Waiting for a connection..." Catch e As Exception output = "Error: " + e.ToString() MessageBox.Show(output) End Try While True ' Always use a Sleep call in a while(true) loop ' to avoid locking up your CPU. Thread.Sleep(10) ' Create a TCP socket. ' If you ran this server on the desktop, you could use ' Socket socket = tcpListener.AcceptSocket() ' for greater flexibility. Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient() ' Read the data stream from the client. Dim bytes(255) As Byte Dim stream As NetworkStream = tcpClient.GetStream() stream.Read(bytes, 0, bytes.Length) Dim helper As New SocketHelper() helper.processMsg(tcpClient, stream, bytes) End While End Sub Shared Sub Main() Application.Run(New Server()) End Sub
static string output = ""; public Server() { } public void createListener() { // Create an instance of the TcpListener class. TcpListener tcpListener = null; IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; try { // Set the listener on the local IP address // and specify the port. tcpListener = new TcpListener(ipAddress, 13); tcpListener.Start(); output = "Waiting for a connection..."; } catch (Exception e) { output = "Error: " + e.ToString(); MessageBox.Show(output); } while (true) { // Always use a Sleep call in a while(true) loop // to avoid locking up your CPU. Thread.Sleep(10); // Create a TCP socket. // If you ran this server on the desktop, you could use // Socket socket = tcpListener.AcceptSocket() // for greater flexibility. TcpClient tcpClient = tcpListener.AcceptTcpClient(); // Read the data stream from the client. byte[] bytes = new byte[256]; NetworkStream stream = tcpClient.GetStream(); stream.Read(bytes, 0, bytes.Length); SocketHelper helper = new SocketHelper(); helper.processMsg(tcpClient, stream, bytes); } } static void Main() { Application.Run(new Server()); }
Server 클래스에서 서버를 시작할 방식을 지정합니다. 예를 들어, 단추의 Click 이벤트에서 createListener를 호출합니다.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.createListener() End Sub
private void button1_Click(object sender, EventArgs e) { this.createListener(); }
SocketHelper라는 클래스를 만들고 이 클래스에 다음 코드를 추가합니다.
Class SocketHelper Private mscClient As TcpClient Private mstrMessage As String Private mstrResponse As String Private bytesSent() As Byte Public Sub processMsg(ByVal client As TcpClient, ByVal stream As NetworkStream, ByVal bytesReceived() As Byte) ' Handle the message received and ' send a response back to the client. mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length) mscClient = client mstrMessage = mstrMessage.Substring(0, 5) If mstrMessage.Equals("Hello") Then mstrResponse = "Goodbye" Else mstrResponse = "What?" End If bytesSent = Encoding.ASCII.GetBytes(mstrResponse) stream.Write(bytesSent, 0, bytesSent.Length) End Sub End Class
class SocketHelper { TcpClient mscClient; string mstrMessage; string mstrResponse; byte[] bytesSent; public void processMsg(TcpClient client, NetworkStream stream, byte[] bytesReceived) { // Handle the message received and // send a response back to the client. mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length); mscClient = client; mstrMessage = mstrMessage.Substring(0, 5); if (mstrMessage.Equals("Hello")) { mstrResponse = "Goodbye"; } else { mstrResponse = "What?"; } bytesSent = Encoding.ASCII.GetBytes(mstrResponse); stream.Write(bytesSent, 0, bytesSent.Length); } }
클라이언트가 서버에 연결하면 서버에서는 이 클래스를 인스턴스화합니다.
Form을 구현하는 Client라는 클래스를 만들고 이 클래스에 다음 코드를 추가합니다.
Shared Sub Connect(ByVal serverIP As String, ByVal message As String) Dim output As String = "" Try ' Create a TcpClient. ' The client requires a TcpServer that is connected ' to the same address specified by the server and port ' combination. Dim port As Int32 = 13 Dim client As New TcpClient(serverIP, port) ' Translate the passed message into ASCII and store it as a byte array. Dim data(255) As [Byte] data = System.Text.Encoding.ASCII.GetBytes(message) ' Get a client stream for reading and writing. ' Stream stream = client.GetStream(); Dim stream As NetworkStream = client.GetStream() ' Send the message to the connected TcpServer. stream.Write(data, 0, data.Length) output = "Sent: " + message MessageBox.Show(output) ' Buffer to store the response bytes. data = New [Byte](255) {} ' String to store the response ASCII representation. Dim responseData As String = String.Empty ' Read the first batch of the TcpServer response bytes. Dim bytes As Int32 = stream.Read(data, 0, data.Length) responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes) output = "Received: " + responseData MessageBox.Show(output) ' Close everything. stream.Close() client.Close() Catch e As ArgumentNullException output = "ArgumentNullException: " + e.ToString() MessageBox.Show(output) Catch e As SocketException output = "SocketException: " + e.ToString() MessageBox.Show(output) End Try End Sub Shared Sub Main() Application.Run(New Client()) End Sub
public Client() { this.MinimizeBox = false; } static void Connect(string serverIP, string message) { string output = ""; try { // Create a TcpClient. // The client requires a TcpServer that is connected // to the same address specified by the server and port // combination. Int32 port = 13; TcpClient client = new TcpClient(serverIP, port); // Translate the passed message into ASCII and store it as a byte array. Byte[] data = new Byte[256]; data = System.Text.Encoding.ASCII.GetBytes(message); // Get a client stream for reading and writing. // Stream stream = client.GetStream(); NetworkStream stream = client.GetStream(); // Send the message to the connected TcpServer. stream.Write(data, 0, data.Length); output = "Sent: " + message; MessageBox.Show(output); // Buffer to store the response bytes. data = new Byte[256]; // String to store the response ASCII representation. String responseData = String.Empty; // Read the first batch of the TcpServer response bytes. Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); output = "Received: " + responseData; MessageBox.Show(output); // Close everything. stream.Close(); client.Close(); } catch (ArgumentNullException e) { output = "ArgumentNullException: " + e; MessageBox.Show(output); } catch (SocketException e) { output = "SocketException: " + e.ToString(); MessageBox.Show(output); } } static void Main() { Application.Run(new Client()); }
Client 클래스에서 사용자가 서버에 연결할 방식을 지정합니다. 예를 들어, 단추의 Click 이벤트에서 Connect 메서드를 호출합니다.
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) ' In this code example, use a hard-coded ' IP address and message. Dim serverIP As String = "localhost" Dim message As String = "Hello" Connect(serverIP, message) End Sub
private void button1_Click(object sender, EventArgs e) { // In this code example, use a hard-coded // IP address and message. string serverIP = "localhost"; string message = "Hello"; Connect(serverIP, message); }
서버 및 클라이언트 응용 프로그램을 컴파일합니다.
두 응용 프로그램을 모두 장치에 배포합니다.
장치에서 서버 응용 프로그램을 실행하고 서버를 시작합니다.
장치에서 클라이언트 응용 프로그램을 실행하고 서버에 연결합니다.
코드 컴파일
클라이언트 프로그램에는 다음 네임스페이스에 대한 참조가 필요합니다.
서버 프로그램에는 다음 네임스페이스에 대한 참조가 필요합니다.