본문으로 바로가기

C# TCP/IP Client Part.2

category C# 2019. 3. 22. 10:26
반응형

(C# WindoForm) 두번 째 Client 소스 

 

1. Send 함수 추가 [서버에 메시지 보내기 함수]

2. Receive 함수 추가 [서버가 보낸 메시지 받기 함수]

3. Delegate 함수 추가

 -> 비동기 통신을 하기 위해 Receive 함수를 스레드로 만들었음

 -> 스레드가 동작되고 있는 함수에서는 TextBox에  출력하기 위해 Delegate 를 사용해야한다.

4. Client 사용자가 입력한 주소와 포트번호를 받아와 서버연결을 할 수 있도록 함

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Threading;

namespace test
{
    public partial class View : Form
    {
        public Boolean ClientCon = false;
        private TcpClient client;
        private NetworkStream mystream;
        private StreamReader myread;
        private StreamWriter mywrite;
        private int _port;
        private String _address;
        byte[] bytes= new byte[1024];
        byte[] Rbyte = new byte[1024];
        String Message = "";
        Thread myreader;
        //===================================
        delegate void AppendTextDelegate(Control ctrl, string s);   // 델리게이트 선언
        AppendTextDelegate _textAppender;                           // 델리게이트 변수선언
        //===================================


        public View()
        {
            
            InitializeComponent();
            _textAppender = new AppendTextDelegate(AppendText); //생성


        }
        //=============================================================

        void AppendText(Control ctrl, string s)
        {
            if (ctrl.InvokeRequired) ctrl.Invoke(_textAppender, ctrl, s);
            else
            {
                string source = ctrl.Text;
                ctrl.Text = source + Environment.NewLine + s;
            }
        }
        //=============================================================

        private void View_Load(object sender, EventArgs e)
        {

        }

            public int fn_port(int port)
            {
                _port = port;

                return _port;
            }
            public String fn_Add(String address)
            {
                _address = address;

                return _address;
            }
        //클라이언트 오픈
            public int fn_open()
            {
                int ret = 0;
                if (!ClientCon)
                {
                    ret = fn_Connection();
                }
                else
                {
                    fn_Disconnection();
                    ret = -1;
                }
                return ret;
            }
        //클라이언트 연결함수
            public int fn_Connection()
            {
                int ret = 0;
                try
                {
                    client = new TcpClient(_address, _port);
                   
                    mystream = client.GetStream();
                    myread = new StreamReader(mystream);
                    mywrite = new StreamWriter(mystream);

                    myreader = new Thread(fn_Receive);
                     myreader.Start();

                    ClientCon = true;

                }
                catch
                {
                    ClientCon = false;
                    ret = -2;
                }
                return ret;
            }
        //클라이언트 종료함수
            public int fn_Disconnection()
            {
                int ret = 0;
                this.ClientCon = false;
                try
                {
                Thread.Sleep(1);
                    if (myread != null) myread.Close();
                    if (mywrite != null) mywrite.Close();
                    if (mystream != null) mystream.Close();
                    if (client != null) client.Close();

                myreader.Abort();
                    

                }
                catch
                {
                    ret = -2;
                }
                return ret;
            }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
        //보내기 버튼
        private void button1_Click(object sender, EventArgs e)
        {
            //보내기 함수
            fn_send();

        }
        //메시지 보내는함수
        public int fn_send()
        {
            int iret = 0;

            String msg = "보내기";
            byte[] buff= Encoding.ASCII.GetBytes(msg);
            mystream = client.GetStream();
            mystream.Write(buff, 0, buff.Length);
            mystream.Flush();

            return iret;
        }
        //메시지 받는함수
        public void fn_Receive()
        {
            //int iret = 0;
            while (ClientCon)
            {
                if (mystream.CanRead)
                {
                     //iret = myread.BaseStream.Read(Rbyte, 0, Rbyte.Length);
                     String myreader = myread.ReadLine();
                     byte[] Rbuff = Encoding.ASCII.GetBytes(myreader);
                    if(Rbuff.Length > 0)
                    {

                        //textBox4.AppendText("도착시간" + " : "+DateTime.Now.ToString() + Environment.NewLine);
                        //textBox4.AppendText("메시지 수신" + " :" + myreader + Environment.NewLine);
                        AppendText(textBox4, "도착시간" + " : " + DateTime.Now.ToString() + Environment.NewLine);
                        AppendText(textBox4, "메시지 수신" + " :" + myreader + Environment.NewLine);
                    }
                    else
                    {
                        textBox4.AppendText("수신불가");
                    }
                    
                }
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {

        }
        //서버연결 버튼
        private void button3_Click(object sender, EventArgs e)
        {
            
            //입력한 주소를 받아옴
            fn_Add(txtAddress.Text.ToString());
            //입력한 아이피를 받아옴
            fn_port(Int32.Parse(txtPort.Text.ToString())); 
            //클라이언트 오픈함수(ClientConnection)
            fn_open();
            //메시지 받기
            //fn_Receive();
            //아이피 받아오기
            if (mystream.CanRead)
            {
                Socket socket = client.Client;
                IPEndPoint ip_p = (IPEndPoint)socket.RemoteEndPoint;
                String ip = ip_p.Address.ToString();

                //if (socket != null) socket.Close();
                textBox4.AppendText(ip + Environment.NewLine);
               
                for (int i = 0; i < 100000000; i++)
                {

                }
                Message = "서버에 연결하였습니다";
                //textBox4.AppendText(DateTime.Now.ToString() + " " + Environment.NewLine);
                //textBox4.AppendText(Message + Environment.NewLine);
                AppendText(textBox4, DateTime.Now.ToString() + " " + Environment.NewLine);
                AppendText(textBox4, Message + Environment.NewLine);
            }
            else
            {
                Message = "서버 연결 실패";
                textBox4.AppendText(Message + Environment.NewLine);
                
            }
            
            
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
        //서버연결끊기버튼
        private void button2_Click_1(object sender, EventArgs e)
        {
            if (ClientCon)
            {

                fn_Disconnection();
                Message = "연결을 끊었습니다";
                textBox4.AppendText(DateTime.Now.ToString() + " " + Environment.NewLine);
                textBox4.AppendText(Message + Environment.NewLine);
            }
            else
            {
                Message = "계속 연결 중";
                textBox4.AppendText(Message);
            }
            
        }
    }
}

 

 

[C#] - C# TCP/IP Client Part.1 [기본소스]

 

C# TCP/IP Client Part.1 [기본소스]

기본적으로 Client에 연결하기 위해 필요한 함수들은 뭐가 있을까?  기본으로 아래 5가지가 필요하다고 생각한다.  1. 연결하기위한 서버측 포트번호  2. 연결하기위한 서버측 주소  3. 클라이언

dodo1054.tistory.com

[C#] - C# TCP/IP Client Part.3

 

C# TCP/IP Client Part.3

드디어 모드버스 TCP/IP 클라이언트 프로그램을 만들었다. 비록 아직은 조금씩 수정해야 할 곳이 있고 우리가 흔히 쓰는 모드버스 프로그램 보다는 퀄리티가 훨씬 떨어진다.. C# 윈폼을 이용하여 T

dodo1054.tistory.com

[C#] - C# TCP/IP Client 테스트 소스

 

C# TCP/IP Client 테스트 소스

C# WinForm으로 작성하였습니다. Test 소스로 작성한거라서 조금 복잡하고 지저분해보일 수 있으실수도 ㅠ 궁금한 점이나 부족한 점은 꼭 댓글남겨주세요^^ 소스는 올리도록하겠습니다. using System; u

dodo1054.tistory.com

 

반응형

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

C# Byte 배열로 형변환 하기  (0) 2019.07.15
C# Postgresql 연동하기  (0) 2019.04.23
C# 폼에서 폼으로 파라미터 인수 넘기기  (0) 2019.04.17
C# TCP/IP Client Part.3  (9) 2019.03.26
C# TCP/IP Client Part.1 [기본소스]  (2) 2019.03.21