2015. 5. 14. 14:23
C# with Service Program
프로그램 설명
윈도우즈 서비스를 이용해서 Tcp 통신을 하는 예제입니다.
서버는 서비스로 만들었으며, 클라이언트는 윈도우즈 폼으로 작성 했습니다.
서버에서 클라이언트와 통신을 할 때 각 단계별로 로그 파일을 쌓아서 진행 상황을 체크 합니다.
1. app.config 파일에 실제 로그를 쌓을 경로 이름을 기술합니다.
Debug 폴더 안에서 파일을 실행 시키면 System.IO.Directory.GetCurrentDirectory() method 를 이용해서 현재의 위치를 찾을 수 있지만, 서비스 프로그램에서 실행 파일의 현재 위치를 찾게되면 64비트 컴퓨터에서는 C:\Windows\SysWOW64 폴더를 찾습니다. 따라서 SysWOW64 폴더 하위에 Log 폴더를 생성합니다.
app.config 파일 안에서 로그 파일의 위치를 풀경로를 이용해서 명시해 줍니다.
2. 로그 파일 이용 방법
로그 라이브러리 : LogFile.cs
LogFile.WriteLog("OnStart"); LogFile.WriteLog(ex.Message, LogFile.LogCode.Error);
3. 윈도우즈 서비스가 설치된 컴퓨터의 방화벽에서 해당하는 포트를 열러 주어야 합니다.
실행 화면
프로그램 작성 순서
1. 서비스 프로그램의 OnStart() 에서 소켓 관련 thread 를 생성합니다.
protected override void OnStart(string[] args) { LogFile.WriteLog("OnStart"); // Create the sub working thread... Thread thread_handler = new Thread(socketMain.StartSocket); thread_handler.IsBackground = true; thread_handler.Start(); }
2. 일반적인 소켓 서버 클래스를 작성합니다.
static TcpListener server = null; #region StartSocket public void StartSocket() { LogFile.WriteLog("StartSocket"); try { // set the TcpListener on port 14000 Int32 port = 14000; // create the server socket & start server = new TcpListener(IPAddress.Any, port); server.Start(); // buffer for reading data byte[] bytes = new byte[2014]; string data = string.Empty; // waiting for a client connection while (true) { LogFile.WriteLog("Waiting for a connection...."); TcpClient client = server.AcceptTcpClient(); LogFile.WriteLog("Connected!"); NetworkStream stream = client.GetStream(); // read the message from client and send the message to client int bytesRead = 0; while ((bytesRead = stream.Read(bytes, 0, bytes.Length)) != 0) { data = Encoding.UTF8.GetString(bytes, 0, bytesRead); LogFile.WriteLog(string.Format("Received : {0}", data)); data = data.ToUpper(); byte[] msg = Encoding.UTF8.GetBytes(data); stream.Write(msg, 0, msg.Length); LogFile.WriteLog(string.Format("Sent : {0}", data)); } client.Close(); } } catch (SocketException se) { LogFile.WriteLog(se.Message, LogFile.LogCode.Error); } catch (Exception ex) { LogFile.WriteLog(ex.Message, LogFile.LogCode.Error); } finally { server.Stop(); } } #endregion
3. OnStop method 에서 socket server를 닫습니다.
protected override void OnStop() { LogFile.WriteLog("OnStop"); socketMain.StopSocket(); }
소스 파일 :
'C# with Service Program' 카테고리의 다른 글
[C#] 서비스 프로그램 - 디버깅 (0) | 2015.05.15 |
---|---|
[C#] 서비스 프로그램 - 1 (0) | 2015.05.11 |