C# TCP Server, Client 예제, 크로스 스레드 응용 소스

C# TCP Server, Client 예제, 크로스 스레드 응용 소스


출처 : Visual C# Kicks

프로젝트 다운로드 -  CrossThreadCalls.zip


C# TCP Server, Client 예제, 크로스 스레드 응용 소스[C# 프로그래밍] 크로스 스레드 Cross Thread 예제


C# tcp 서버 클라이언트 예제[C# 프로그래밍] 크로스 스레드 Cross Thread 예제


Cross Thread를 응용한 C# TCP / IP 통신입니다.


C#에서 교차 스레드 작업(Cross Thread)이란 다른 스레드에서 컴포넌트를 호출하여 사용한다는 의미입니다. .NET 프레임워크 2.0부터 적절한 교차 스레드 작업은 더이상 옵션 수준에 머물지 않고, 프로그래밍 시 요구 사항으로 전환되었기에 매우 중요한 부분 중 하나입니다.


예를 들어, 별도의 스레드를 현재 작업 중인 폼에서 호출하면 아래와 같은 오류 메세지가 뜹니다.


Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.

= (뭔 말이냐면) 날 만든 폼이 아닌 곳에선 동작하지 않을 거임.

C# TCP Server, Client 예제) Delegate

해결책으론 누구나 예상하겠지만, Delegate(Invoke 메소드)를 사용하는 것입니다. 델리게이트는 다른 스레드를 현재의 폼으로 호출하여 사용할 수 있는 "멋진 방법"입니다.


C# TCP Server, Client 예제) Methods

예를 들어, 두 개의 메소드가 존재합니다.


하나는 루프를 수행하고, 하나는 단일 크로스 스레드 작업을 수행합니다. 요점은, 서로 방해하지 않으면서 두 스레드는 정상적으로 동작해야 한다는 점입니다.


C# TCP Server, Client 예제, 크로스 스레드 응용 소스[C# 프로그래밍] 크로스 스레드 Cross Thread 예제


여기서 소개할 프로그램에선, 스레드를 이용해 일종의 깜박이를 구현하여 스레드 동작 여부를 판별합니다. 크로스 스레드 호출의 요점은, InvokeRequired의 특성입니다. 크로스 스레드를 사용할 때, 속성 값은 true가 됩니다.


이 시점에 Invoke 메소드를 호출하는 델리게이트를 사용할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
if (this.InvokeRequired)
{
    BlinkDelegate del = new BlinkDelegate(Blink);  // delegate
    object[] parameters = { secondsInterval } ;  // parameters
    this.Invoke(del, parameters);  // call
}
else
{   
    //What you want done goes here
}
cs


그리고, 크로스 스레드를 응용하면, 스레드 + 이벤트 + TCP 구현이 가능합니다.


결과적으로 While이 돌면서 메시지를 계속 수신하고, 이를 스레드가 처리하면서 다른 기능들도 동작합니다.

C# TCP Server, Client 예제) 수신측,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public ManualResetEvent mreStep1 = new ManualResetEvent(false);
 
public void Step1()
{
    mreStep1.WaitOne();
    mreStep1.Reset();
 
    int recv;
    byte[] data = new byte[1024];
    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
 
    Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
    newsock.Bind(ipep);
    newsock.Listen(10);
    Socket client = newsock.Accept();
    IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
    Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
 
    while (true)
    {
        data = new byte[1024];
        recv = client.Receive(data);
        if (recv == 0)
            break;
 
        Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
        client.Send(data, recv, SocketFlags.None);
 
        Thread.Sleep(3000);
        mreStep1.Set();
    }
}
 
public void DoTest()
{
    Thread thread1 = new Thread(new ThreadStart(Step1));
    thread1.Start();
    mreStep1.Set();
}
 
private void Form1_Load(object sender, EventArgs e)
{
    ClassName rt = new ClassName();
    rt.DoTest();
}
cs


C# TCP Server, Client 예제) 송신측,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public IPEndPoint ipep;
public Socket server;
 
private void ControlForm_Load(object sender, EventArgs e)
{
    ipep = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xxx"), 9050);
    server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
    try
    {
        server.Connect(ipep);
    }
    catch (SocketException er)
    {
        MessageBox.Show(er.Message.ToString());
        return;
    }
}
 
private void Communication(string message)
{
    byte[] data = new byte[1024];
            
    server.Send(Encoding.ASCII.GetBytes(message));
    //server.Shutdown(SocketShutdown.Both);
    //server.Close();
}
 
private void button6_Click(object sender, EventArgs e)
{
    Communication("Test message");
}
 
cs


송신과 수신측에 위와 같은 소스 코드를 추가해 줍니다.


기존의 기능 외에 C# TCP를 이용한 메시지 송수신 기능이 추가됩니다. 저의 경우엔 TCP로 임베디드 기기에 명령어 전송이 가능합니다.


원격으로 제어가 가능하다는 뜻이 되겠죠.


C# TCP Server, Client 예제, 크로스 스레드 응용 소스

댓글(0)

Designed by JB FACTORY