블로그 이미지
따시쿵

calendar

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

Notice

2015. 3. 17. 15:41 C# with TCP/IP

프로그램 설명




실행 후




Connect 버튼 클릭 후




메시지 전송 후




프로그램 작성


1. handleClient.cs (서버에서 사용하는 클래스)


    class handleClient
    {
        TcpClient clientSocket = null;
        public Dictionary<Tcpclient, string> clientList = null;

        public void startClient(TcpClient clientSocket, Dictionary<Tcpclient, string> clientList)
        {
            this.clientSocket = clientSocket;
            this.clientList = clientList;

            Thread t_hanlder = new Thread(doChat);
            t_hanlder.IsBackground = true;
            t_hanlder.Start();
        }

        public delegate void MessageDisplayHandler(string message, string user_name);
        public event MessageDisplayHandler OnReceived;

        public delegate void DisconnectedHandler(TcpClient clientSocket);
        public event DisconnectedHandler OnDisconnected;

        private void doChat()
        {
            NetworkStream stream = null;
            try
            {
                byte[] buffer = new byte[1024];
                string msg = string.Empty;
                int bytes = 0;
                int MessageCount = 0;

                while (true)
                {
                    MessageCount++;
                    stream = clientSocket.GetStream();
                    bytes = stream.Read(buffer, 0, buffer.Length);
                    msg = Encoding.Unicode.GetString(buffer, 0, bytes);
                    msg = msg.Substring(0, msg.IndexOf("$"));

                    if (OnReceived != null)
                        OnReceived(msg, clientList[clientSocket].ToString());
                }
            }
            catch (SocketException se)
            {
                Trace.WriteLine(string.Format("doChat - SocketException : {0}", se.Message));

                if (clientSocket != null)
                {
                    if (OnDisconnected != null)
                        OnDisconnected(clientSocket);

                    clientSocket.Close();
                    stream.Close();
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("doChat - Exception : {0}", ex.Message));

                if (clientSocket != null)
                {
                    if (OnDisconnected != null)
                        OnDisconnected(clientSocket);

                    clientSocket.Close();
                    stream.Close();
                }
            }
        }

    }


2. 서버 프로그램


    public partial class MainForm : Form
    {
        TcpListener server = null;
        TcpClient clientSocket = null;
        static int counter = 0;

        public Dictionary<Tcpclient, string> clientList = new Dictionary<Tcpclient,string>();
 
        public MainForm()
        {
            InitializeComponent();

            // socket start
            Thread t = new Thread(InitSocket);
            t.IsBackground = true;
            t.Start();
        }

        private void InitSocket()
        {
            server = new TcpListener(IPAddress.Any, 9999);
            clientSocket = default(TcpClient);
            server.Start();
            DisplayText(">> Server Started");

            while(true)
            {
                try
                {
                    counter++;
                    clientSocket = server.AcceptTcpClient();
                    DisplayText(">> Accept connection from client");

                    NetworkStream stream = clientSocket.GetStream();
                    byte[] buffer = new byte[1024];
                    int bytes = stream.Read(buffer, 0, buffer.Length);
                    string user_name = Encoding.Unicode.GetString(buffer, 0, bytes);
                    user_name = user_name.Substring(0, user_name.IndexOf("$"));

                    clientList.Add(clientSocket, user_name);

                    // send message all user
                    SendMessageAll(user_name + " Joined ", "",  false);

                    handleClient h_client = new handleClient();
                    h_client.OnReceived += new handleClient.MessageDisplayHandler(OnReceived);
                    h_client.OnDisconnected += new handleClient.DisconnectedHandler(h_client_OnDisconnected);                    
                    h_client.startClient(clientSocket, clientList);
                }
                catch (SocketException se)
                {
                    Trace.WriteLine(string.Format("InitSocket - SocketException : {0}", se.Message));
                    break;
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(string.Format("InitSocket - Exception : {0}", ex.Message));
                    break;
                }
            }

            clientSocket.Close();
            server.Stop();
        }

        void h_client_OnDisconnected(TcpClient clientSocket)
        {
            if (clientList.ContainsKey(clientSocket))
                clientList.Remove(clientSocket);
        }

        private void OnReceived(string message, string user_name)
        {
            string displayMessage = "From client : " + user_name + " : " + message;
            DisplayText(displayMessage);
            SendMessageAll(message, user_name, true);
        }

        public void SendMessageAll(string message, string user_name, bool flag)
        {
            foreach(var pair in clientList)
            {
                Trace.WriteLine(string.Format("tcpclient : {0} user_name : {1}", pair.Key, pair.Value));

                TcpClient client = pair.Key as TcpClient;
                NetworkStream stream = client.GetStream();
                byte[] buffer = null;

                if(flag)
                {
                    buffer = Encoding.Unicode.GetBytes(user_name + " says : " + message);
                }
                else
                {
                    buffer = Encoding.Unicode.GetBytes(message);
                }
                
                stream.Write(buffer, 0, buffer.Length);
                stream.Flush();
            }
        }

        private void DisplayText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBox1.AppendText(text + Environment.NewLine);
                }));
            }
            else
                richTextBox1.AppendText(text + Environment.NewLine);
        }
    }


3. 클라이언트 프로그램


    public partial class MainForm : Form
    {
        TcpClient clientSocket = new TcpClient();
        NetworkStream stream = default(NetworkStream);
        string message = string.Empty;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btnSendText_Click(object sender, EventArgs e)
        {
            byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxMessage.Text + "$");
            stream.Write(buffer, 0, buffer.Length);
            stream.Flush();
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            clientSocket.Connect("192.168.0.12", 9999);
            stream = clientSocket.GetStream();

            message = "Connected to Chat Server";
            DisplayText(message);

            byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxNickName.Text + "$");
            stream.Write(buffer, 0, buffer.Length);
            stream.Flush();

            Thread t_handler = new Thread(GetMessage);
            t_handler.IsBackground = true;
            t_handler.Start();
        }

        private void GetMessage()
        {
            while(true)
            {
                stream = clientSocket.GetStream();
                int BUFFERSIZE = clientSocket.ReceiveBufferSize;
                byte[] buffer = new byte[BUFFERSIZE];
                int bytes = stream.Read(buffer, 0, buffer.Length);

                string message = Encoding.Unicode.GetString(buffer, 0, bytes);
                DisplayText(message);
            }
        }

        private void DisplayText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBox1.AppendText(text + Environment.NewLine);
                }));
            }
            else
                richTextBox1.AppendText(text + Environment.NewLine);
        }
    }


posted by 따시쿵
2015. 3. 14. 17:30 C# with TCP/IP

프로그램 설명


1:1 통신에 이어서 1:N 통신을 다루는 프로그램입니다.

각 클라이언트 소켓마다 쓰레드를 만들어서 통신하는 방법입니다.





실행 후




메신지 전송 후




프로그램 작성 순서


1. 서버 사이드 소켓 핸들 (handleClient.cs)


    class handleClient
    {
        TcpClient clientSocket;
        int clientNo;

        public void startClient(TcpClient ClientSocket, int clientNo)
        {
            this.clientSocket = ClientSocket;
            this.clientNo = clientNo;

            Thread t_hanlder = new Thread(doChat);
            t_hanlder.IsBackground = true;
            t_hanlder.Start();
        }

        public delegate void MessageDisplayHandler(string text);
        public event MessageDisplayHandler OnReceived;

        public delegate void CalculateClientCounter();
        public event CalculateClientCounter OnCalculated;

        private void doChat()
        {
            NetworkStream stream = null;
            try
            { 
                byte[] buffer = new byte[1024];
                string msg = string.Empty;
                int bytes = 0;
                int MessageCount = 0;                

                while(true)
                {
                    MessageCount++;
                    stream = clientSocket.GetStream();
                    bytes = stream.Read(buffer, 0, buffer.Length);
                    msg = Encoding.Unicode.GetString(buffer, 0, bytes);
                    msg = msg.Substring(0, msg.IndexOf("$"));
                    msg = "Data Received : " + msg;

                    if (OnReceived != null)
                        OnReceived(msg);

                    msg = "Server to client(" + clientNo.ToString() + ") " + MessageCount.ToString();
                    if (OnReceived != null)
                        OnReceived(msg);

                    byte[] sbuffer = Encoding.Unicode.GetBytes(msg);
                    stream.Write(sbuffer, 0, sbuffer.Length);
                    stream.Flush();

                    msg = " >> " + msg;
                    if (OnReceived != null) { 
                        OnReceived(msg);
                        OnReceived("");
                    }
                }
            }
            catch(SocketException se)
            {
                Trace.WriteLine(string.Format("doChat - SocketException : {0}", se.Message));

                if (clientSocket != null)
                {
                    clientSocket.Close();
                    stream.Close();
                }

                if (OnCalculated != null)
                    OnCalculated();
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("doChat - Exception : {0}", ex.Message));

                if (clientSocket != null)
                {
                    clientSocket.Close();
                    stream.Close();
                }

                if (OnCalculated != null)
                    OnCalculated();
            }
        }
    }


2. 서버 프로그램


    public partial class MainForm : Form
    {
        TcpListener server = null;
        TcpClient client = null;
        static int counter = 0;

        public MainForm()
        {
            InitializeComponent();

            // socket start
            Thread t = new Thread(InitSocket);
            t.IsBackground = true;
            t.Start();
        }
        
        private void InitSocket()
        {
            server = new TcpListener(IPAddress.Any, 9999);
            client = default(TcpClient);
            server.Start();
            DisplayText(">> Server Started");

            while(true)
            {
                try
                { 
                    counter++;
                    client = server.AcceptTcpClient();
                    DisplayText(">> Accept connection from client");

                    handleClient h_client = new handleClient();
                    h_client.OnReceived += new handleClient.MessageDisplayHandler(DisplayText);
                    h_client.OnCalculated += new handleClient.CalculateClientCounter(CalculateCounter);
                    h_client.startClient(client, counter);
                }
                catch (SocketException se)
                {
                    Trace.WriteLine(string.Format("InitSocket - SocketException : {0}", se.Message));
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(string.Format("InitSocket - Exception : {0}", ex.Message));
                }
            }        
        }

        private void CalculateCounter()
        {
            counter--;
        }

        private void DisplayText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBox1.AppendText(text + Environment.NewLine);
                }));
            }
            else
                richTextBox1.AppendText(text + Environment.NewLine); 
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (client != null)
            {
                client.Close();
                client = null;
            }

            if (server != null)
            {
                server.Stop();
                server = null;
            }
        }
    }


3. 클라이언트 프로그램


    public partial class MainForm : Form
    {
        TcpClient clientSocket = new TcpClient();

        public MainForm()
        {
            InitializeComponent();

            new Thread(delegate()
                {
                    InitSocket();
                }).Start();            
        }

        private void InitSocket()
        {
            try
            {
                clientSocket.Connect("192.168.0.12", 9999);
                DisplayText("Client Started");
                labelStatus.Text = "Client Socket Program - Server Connected ...";
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message, "Error");                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            NetworkStream stream = clientSocket.GetStream();
            byte[] sbuffer = Encoding.Unicode.GetBytes(richTextBox2.Text + "$");
            stream.Write(sbuffer, 0, sbuffer.Length);
            stream.Flush();

            byte[] rbuffer = new byte[1024];
            stream.Read(rbuffer, 0, rbuffer.Length);
            string msg = Encoding.Unicode.GetString(rbuffer);
            msg = "Data from Server : " + msg;
            DisplayText(msg);

            richTextBox2.Text = "";
            richTextBox2.Focus();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (clientSocket != null)
                clientSocket.Close();
        }

        private void DisplayText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBox1.AppendText(Environment.NewLine + " >> " + text);
                }));
            }
            else
                richTextBox1.AppendText(Environment.NewLine + " >> " + text);
        }
    }


posted by 따시쿵
2015. 3. 13. 15:39 Asp.net with WebSocket

프로그램 설명


websocket을 이용해서 메시지를 주고 받는 라이브러리가 있어서 소개합니다.


셋팅하는 방법은 파일을 다운받은 후, mssql db 를 인스톨하고 디비명과 아이디, 비밀번호를 셋팅하고, 다운로드 받은 파일을 웹 서버 폴더 밑에 두거나 localhost 로 운영할 수 있는 곳이면 셋팅은 모두 완료입

니다.


라이브러리 다운 받을 곳 : http://cutesoft.net/asp.net+Chat/



실행 후





posted by 따시쿵
2015. 3. 12. 16:41 C# with TCP/IP

프로그램 설명


한 프로그램에서 여러개의 포트를 열어서 작업이 필요한 경우입니다.

포트별로 쓰레드를 만들어서 작업하는 방식입니다. 예제에서는 8080, 8081 포트를 엽니다.




실행 후



프로그램 작성 순서


1. ListenPorts.cs


    class ListenPorts
    {
        Socket[] socket;
        IPEndPoint[] ipEndPoint;

        internal ListenPorts(IPEndPoint[] ipEndPoint)
        {
            this.ipEndPoint = ipEndPoint;
            socket = new Socket[ipEndPoint.Length];
        }

        public void beginListen()
        {
            for(int i = 0; i < ipEndPoint.Length; i++)
            {
                socket[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket[i].Bind(ipEndPoint[i]);

                Thread t_handler = new Thread(threadListen);
                t_handler.IsBackground = true;
                t_handler.Start(socket[i]);
            }
        }

        private void threadListen(object sender)
        {
            Socket m_client = sender as Socket;
            byte[] data = new byte[1024];
            
            try
            {
                m_client.Listen(100);
                Socket newSocket = m_client.Accept();
                int bytes = newSocket.Receive(data);

                IPEndPoint remoteIP = newSocket.RemoteEndPoint as IPEndPoint;
                IPEndPoint localIP = newSocket.LocalEndPoint as IPEndPoint;

                Console.WriteLine("server ip : {0} remote ip : {1} ", localIP.ToString(), remoteIP.ToString());
                Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(data, 0, bytes));
                
                string msg = "Welcome to multiple server";
                byte[] buffer = Encoding.Unicode.GetBytes(msg);
                newSocket.Send(buffer, buffer.Length, SocketFlags.None);
                Console.WriteLine("Send data : {0}", msg);
                Console.WriteLine();
            }
            catch(SocketException se)
            {
                Console.WriteLine(se.Message);
            }
            
        }
    }


2. 서버 프로그램


    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint ipEndPoint1 = new IPEndPoint(IPAddress.Any, 8080);
            IPEndPoint ipEndPoint2 = new IPEndPoint(IPAddress.Any, 8081);

            IPEndPoint[] ipEndPoint = new IPEndPoint[2] { ipEndPoint1, ipEndPoint2 };
            //IPEndPoint[] ipEndPoint = new IPEndPoint[1] { ipEndPoint1 };

            ListenPorts listenport = new ListenPorts(ipEndPoint);
            listenport.beginListen();
            Console.WriteLine("Begin Listen");
            Console.WriteLine();
            
            Console.ReadKey();
        }
    }


3. 클라이언트 프로그램


    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[1024];

            //TCP Client

            Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());
            Console.WriteLine();

            //Set the IP address of the server, and its port.
            IPEndPoint ipep1 = new IPEndPoint(IPAddress.Parse("192.168.0.12"), 8080);
            IPEndPoint ipep2 = new IPEndPoint(IPAddress.Parse("192.168.0.12"), 8081);
            string welcome = "Hello, Multiple server ! ";

            // port 8080 으로 전송
            try
            {
                // 소켓 생성
                Socket server1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // 메시지 전송
                data = Encoding.Unicode.GetBytes(welcome);
                server1.Connect(ipep1);
                server1.Send(data);
                Console.WriteLine("Send by the port : {0}", server1.LocalEndPoint.ToString());
                Console.WriteLine("Send data : {0}", welcome);

                // 메시지 받음
                byte[] msg = new byte[1024];
                int bytes = server1.Receive(msg);
                Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(msg, 0, bytes));
                Console.WriteLine();
                // 소켓 닫기
                server1.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            // port 8081 으로 전송
            try
            {
                // 소켓 생성
                Socket server2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // 메시지 전송
                data = Encoding.Unicode.GetBytes(welcome);
                server2.Connect(ipep2);
                server2.Send(data);
                Console.WriteLine("Send by the port : {0}", server2.LocalEndPoint.ToString());
                Console.WriteLine("Send data : {0}", welcome);

                // 메시지 받음
                byte[] msg = new byte[1024];
                int bytes = server2.Receive(msg);
                Console.WriteLine("Received data : {0}", Encoding.Unicode.GetString(msg, 0, bytes));
                Console.WriteLine();
                // 소켓 닫기
                server2.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadKey();
        }
    }


posted by 따시쿵
2015. 3. 12. 10:20 C# with TCP/IP

프로그램 설명


TcpListener와 TcpClient를 이용한 1:1 통신을 하는 프로그램입니다.

서버와 클라이언트 통신하는 순서와 아래와 같습니다.




실행 후




메시진 전송 후




프로그램 작성 순서


1. 서버 프로그램


    public partial class MainForm : Form
    {
        TcpListener serverSocket = null;
        TcpClient clientSocket = null;

        public MainForm()
        {
            InitializeComponent();

            // socket start
            new Thread(delegate()
                {
                    InitSocket();
                }).Start();
        }

        private void InitSocket()
        {
            try
            { 
                serverSocket = new TcpListener(IPAddress.Any, 9999);
                clientSocket = default(TcpClient);
                serverSocket.Start();
                DisplayText(" >> Server Started");

                clientSocket = serverSocket.AcceptTcpClient();
                DisplayText(" >> Accept connection from client");

                Thread threadHandler = new Thread(new ParameterizedThreadStart(OnAccepted));
                threadHandler.IsBackground = true;
                threadHandler.Start(clientSocket);
            }
            catch (SocketException se)
            {
                DisplayText(string.Format("InitSocket : SocketException : {0}", se.Message));
            }
            catch (Exception ex)
            {
                DisplayText(string.Format("InitSocket : Exception : {0}", ex.Message));
            }
        }

        private void OnAccepted(object sender)
        {
            TcpClient clientSocket = sender as TcpClient;

            while (true)
            {
                try
                {
                    NetworkStream stream = clientSocket.GetStream();
                    byte[] buffer = new byte[1024];

                    stream.Read(buffer, 0, buffer.Length);
                    string msg = Encoding.Unicode.GetString(buffer);
                    msg = msg.Substring(0, msg.IndexOf("$"));
                    DisplayText(" >> Data from client - " + msg);

                    string response = "Last Message from client - " + msg;
                    byte[] sbuffer = Encoding.Unicode.GetBytes(response);

                    stream.Write(sbuffer, 0, sbuffer.Length);
                    stream.Flush();

                    DisplayText(" >> " + response);
                }
                catch (SocketException se)
                {
                    DisplayText(string.Format("OnAccepted : SocketException : {0}", se.Message));
                    break;
                }
                catch (Exception ex)
                {
                    DisplayText(string.Format("OnAccepted : Exception : {0}", ex.Message));
                    break;
                }
            }

            clientSocket.Close();
        }

        private void DisplayText(string text)
        {
            if (richTextBoxMsg.InvokeRequired)
            {
                richTextBoxMsg.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBoxMsg.AppendText(text + Environment.NewLine);
                }));
            }
            else
                richTextBoxMsg.AppendText(text + Environment.NewLine);
 
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (clientSocket != null)
            { 
                clientSocket.Close();
                clientSocket = null;
            }

            if (serverSocket != null)
            {
                serverSocket.Stop();
                serverSocket = null;
            }
        }
    }


2. 클라이언트 프로그램


    public partial class MainForm : Form
    {
        TcpClient clientSocket = new TcpClient();

        public MainForm()
        {
            InitializeComponent();

            new Thread(delegate()
            {
                InitSocket();
            }).Start();      
        }

        private void InitSocket()
        {
            try
            { 
                clientSocket.Connect("192.168.0.12", 9999);
                DisplayText("Client Started");
                labelStatus.Text = "Client Socket Program - Server Connected ...";
            }
            catch (SocketException se) 
            {
                MessageBox.Show(se.Message, "Error");
            }
            catch (Exception ex) 
            {
                MessageBox.Show(ex.Message, "Error");
            }
        }
        
        private void btnSend_Click(object sender, EventArgs e)
        {
            NetworkStream stream = clientSocket.GetStream();
            byte[] sbuffer = Encoding.Unicode.GetBytes(richTextBox2.Text + "$");
            stream.Write(sbuffer, 0, sbuffer.Length);
            stream.Flush();

            byte[] rbuffer = new byte[1024];
            stream.Read(rbuffer, 0, rbuffer.Length);
            string msg = Encoding.Unicode.GetString(rbuffer);
            DisplayText(msg);

            richTextBox2.Text = "";
            richTextBox2.Focus();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (clientSocket != null)
                clientSocket.Close();
        }

        private void DisplayText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new MethodInvoker(delegate
                {
                    richTextBox1.AppendText(Environment.NewLine + " >> " + text);
                }));
            }
            else
                richTextBox1.AppendText(Environment.NewLine + " >> " + text);
        }
    }


posted by 따시쿵
2015. 3. 10. 10:49 C# with SerialPort

프로그램 설명


인스턴스 메시지 기능으로 통신하는 프로그램입니다.


사용한 시리얼포트는 COM3(write), COM4(read) 이며, 설정 화면은 아래와 같습니다.




실행 후




메시지 전송 후







프로그램 작성


        public Form1()
        {
            InitializeComponent();
        }

        private static string RxString = string.Empty;

        #region initButton click method
        private void initButton_Click(object sender, EventArgs e)
        {
            try
            {
                // 시리얼 포트가 열려 있는지 확인
                if (!serialPortWrite.IsOpen && !serialPortRead.IsOpen)
                {
                    // 메시지 출력
                    richTextBoxCom4.Text = serialPortWrite.PortName + " Ready!!!" + Environment.NewLine;
                    richTextBoxCom4.AppendText(serialPortRead.PortName + " Ready!!!" + Environment.NewLine);

                    // 포트 오픈
                    serialPortRead.Open();
                    serialPortWrite.Open();

                    // 버튼 비활성화
                    initButton.Enabled = false;
                }
                else
                {
                    richTextBoxCom4.Text = "Port isn't opened";
                }
            }
            catch(UnauthorizedAccessException ex)
            {
                MessageBox.Show(ex.Message, "Error");
            }
        }
        #endregion

        #region Form1_FormClosing method
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPortWrite.IsOpen)
                serialPortWrite.Close();

            if (serialPortRead.IsOpen)
                serialPortRead.Close();
        }
        #endregion

        #region serialPortRead DataReceived method
        private void serialPortRead_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                RxString = serialPortRead.ReadExisting();
                this.Invoke(new EventHandler(DisplayText));
            }
            catch (TimeoutException ex) { }
        }
        #endregion

        #region Displaytext
        private void DisplayText(object sender, EventArgs e)
        {
            richTextBoxCom4.AppendText(RxString);
        }
        #endregion

        #region sendButton click method
        private void sendButton_Click(object sender, EventArgs e)
        {
            serialPortWrite.Write(richTextBoxCom3.Text + Environment.NewLine);
        }
        #endregion

        #region richTextBoxCom3 KeyPress method
        private void richTextBoxCom3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!serialPortWrite.IsOpen || !instanceMS.Checked)
                return;

            char[] buffer = new char[1];
            buffer[0] = e.KeyChar;

            serialPortWrite.Write(buffer, 0, buffer.Length);
        }
        #endregion

        #region clearButton click method
        private void clearButton_Click(object sender, EventArgs e)
        {
            richTextBoxCom3.Text = "";
            richTextBoxCom4.Text = "";
        }
        #endregion

 

 

소스 파일 :

serialPortTest2.zip

 


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

[Program C#] 시리얼포트로 읽기/쓰기 - 기본  (0) 2015.03.09
posted by 따시쿵
2015. 3. 9. 17:00 C# with SerialPort

프로그램 설명


일반 컴퓨터에서 개발을 하기 위해서는 몇가지 선행 준비 작업을 해야 합니다.


준비사항 


1. putty 를 인스톨하여 시뮬레이션을 테스트 

   ==> https://bitbucket.org/daybreaker/iputty/downloads


2. 가상 시리얼포트를 만듦 

   ==> Com0Com v3.0.0.0 W7 x64 (64bit) signed



Com0Com 설정 및  PC 장치관리자 셋팅 후의 모습




실행 후




메시지 전송 후


프로그램 작성 순서


1. 디자인 화면




2. 코드 화면


        public Form1()
        {
            InitializeComponent();
        }

        private void btnInit_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen){
                serialPort1.PortName = "COM4";
                serialPort1.Open();
                richTextBox1.Text = "opened";

                btnInit.Enabled = false;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.Close();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                string text = richTextBox1.Text;
                serialPort1.Write(text + Environment.NewLine);
            }
        }


posted by 따시쿵
2015. 3. 6. 16:46 C# with TCP/IP
프로그램 설명

비동기로 접속을 하고 데이타를 주고 받는 방법중에 method 뒤에 SocketAsyncEventArgs class 를 이용하는 방법입니다.

실행 후



데이타 전송 후




프로그램 작성 순서


1. 서버 프로그램


        #region MainForm
        public MainForm()
        {
            InitializeComponent();
        }
        #endregion

        #region MainForm_Load
        private Socket m_ServerSocket;
        private List m_ClientSocket;
        private byte[] szData;

        private void MainForm_Load(object sender, EventArgs e)
        {
            m_ClientSocket = new List();

            m_ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10000);
            m_ServerSocket.Bind(ipep);
            m_ServerSocket.Listen(20);

            SocketAsyncEventArgs args = new SocketAsyncEventArgs();
            args.Completed += new EventHandler(Accept_Completed);
            m_ServerSocket.AcceptAsync(args);
        }
        #endregion

        #region Accept_Completed
        private void Accept_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket ClientSocket = e.AcceptSocket;
            m_ClientSocket.Add(ClientSocket);

            //접속한 클라이언수 보이기
            label1.Text = m_ClientSocket.Count.ToString();

            try
            { 
                if (m_ClientSocket != null)
                {
                    SocketAsyncEventArgs args = new SocketAsyncEventArgs();

                    szData = new byte[1024];
                    args.SetBuffer(szData, 0, szData.Length);
                    args.UserToken = m_ClientSocket;
                    args.Completed += new EventHandler(Receive_Completed);
                    ClientSocket.ReceiveAsync(args);
                }

                e.AcceptSocket = null;
                m_ServerSocket.AcceptAsync(e);
             }
            catch(SocketException se)
            {
                Trace.WriteLine(string.Format("SocketException : {0}", se.Message));
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("Exception : {0}", ex.Message));
            }
        }
        #endregion

        #region Receive_Completed
        private void Receive_Completed(object sender, SocketAsyncEventArgs e)
        {
            Socket ClientSocket = sender as Socket;

            if (ClientSocket.Connected && e.BytesTransferred > 0)
            {
                byte[] szData = e.Buffer;
                string sData = Encoding.Unicode.GetString(szData);

                sData = sData.Replace("\0", "").Trim();
                SetText(sData);
                e.SetBuffer(szData, 0, 1024);
                ClientSocket.ReceiveAsync(e);
            }
            else
            {
                ClientSocket.Disconnect(false);
                ClientSocket.Dispose();
                m_ClientSocket.Remove(ClientSocket);
            }

            //접속한 클라이언수 보이기
            label1.Text = m_ClientSocket.Count.ToString();
        }
        #endregion

        #region SetText
        private delegate void SetTextCallback(string text);
        private void SetText(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                if (richTextBox1.TextLength > 0)
                {
                    richTextBox1.AppendText("\n");
                }

                richTextBox1.AppendText(text);
                richTextBox1.ScrollToCaret();
            }
        }
        #endregion

        #region Dispose
        protected override void Dispose(bool disposing)
        {
            foreach(Socket pBuffer in m_ClientSocket)
            {
                if (pBuffer.Connected)
                    pBuffer.Disconnect(false);
                pBuffer.Dispose();
            }
            m_ServerSocket.Dispose();

            if (disposing && components != null)
                components.Dispose();

            base.Dispose(disposing);
        }
        #endregion


2. 클라이언트 프로그램


        #region MainForm
        public MainForm()
        {
            InitializeComponent();
        }
        #endregion

        private Socket m_ClientSocket = null;

        #region MainForm_Load
        private void MainForm_Load(object sender, EventArgs e)
        {
            m_ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("192.168.0.12"), 10000);

            SocketAsyncEventArgs args = new SocketAsyncEventArgs();
            args.RemoteEndPoint = remoteIP;

            m_ClientSocket.ConnectAsync(args);
        }
        #endregion

        #region button1_Click method
        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 0)
            {
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
                byte[] szData = Encoding.Unicode.GetBytes(textBox1.Text);

                args.SetBuffer(szData, 0, szData.Length);
                m_ClientSocket.SendAsync(args);

                textBox1.Text = "";
                textBox1.Focus();
            }
        }
        #endregion

        #region Dispose
        protected override void Dispose(bool disposing)
        {
            if (m_ClientSocket.Connected)
                m_ClientSocket.Disconnect(false);
            m_ClientSocket.Dispose();

            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #endregion

posted by 따시쿵
2015. 3. 2. 17:16 C#

프로그램 설명


BackgroundWorker 클래스를 이용한 프로그램을 만들어 봤습니다.


두 가지 방법으로 만들었는데,

첫번째 방법은 도구 상자에서 Background 컴포넌트를 디자인 화면에 드래그하는 방법과 두번째는 스크립트로 직접 타이핑을 하는 방법으로 개발했습니다.


첫번째 프로그램에 thread id 를 Debug 시에 출력을 해서 어떤 method 가 ui thread와 다르게 운영되는지 확인 해 보았습니다. 예상한대로 DoWork method 가 ui thread와 다르네요.


new Thread와 비교를 해보면 화면 출력을 편리하게 할 수 있고, 진행 상황을 확인해야 하는 프로그램에 적용하면 편리하게 사용이 가능할 듯 합니다.

 

실행 후





프로그램 작성


1. 첫번째 프로그램


        public MainForm()
        {
            InitializeComponent();

            Debug.WriteLine("MainForm() thread id : {0}", Thread.CurrentThread.ManagedThreadId);
        }

        #region start buton click method
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
                label2.Text = "Busy processing, please waiting!!!!";
            else
                backgroundWorker1.RunWorkerAsync();

            Debug.WriteLine("btnStart_Click() thread id : {0}", Thread.CurrentThread.ManagedThreadId);
        }
        #endregion
             
        #region cancel buton click method
        private void btnCalcel_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
                backgroundWorker1.CancelAsync();
            else
                label2.Text = "No cancel processing !!!";

            Debug.WriteLine("btnCalcel_Click() thread id : {0}", Thread.CurrentThread.ManagedThreadId);
        }
        #endregion

        #region backgroundworker DoWork event
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Debug.WriteLine("backgroundWorker1_DoWork() thread id : {0}", Thread.CurrentThread.ManagedThreadId);

            int sum = 0;
            for(int i = 0; i<= 100; i++)
            {
                simulateHeavyWork();
                sum += i;
                backgroundWorker1.ReportProgress(i);

                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    backgroundWorker1.ReportProgress(0);
                    return;
                }
            }

            e.Result = sum;
        }
        #endregion

        #region simulate heavy work
        private void simulateHeavyWork()
        {
            Thread.Sleep(100);
        }
        #endregion

        #region backgroundworker ProgressChanged event
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label1.Text = e.ProgressPercentage.ToString() + " %";

            Debug.WriteLine("ProgressChanged() thread id : {0}", Thread.CurrentThread.ManagedThreadId);
        }
        #endregion

        #region backgroundworker RunWorkerCompleted event
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
                label1.Text = "Processing cancelled";
            else if (e.Error != null)
                label1.Text = e.Error.Message;
            else
                label1.Text = "Sum = " + e.Result.ToString();

            Debug.WriteLine("backgroundWorker1_RunWorkerCompleted() thread id : {0}", Thread.CurrentThread.ManagedThreadId);
        }
        #endregion

        #region program close
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion

 


2. 두번째 프로그램


        private BackgroundWorker myWorker = null;

        #region MainForm() - BackgroundWorker create
        public MainForm()
        {
            InitializeComponent();
            myWorker = new BackgroundWorker();

            myWorker.WorkerReportsProgress = true;
            myWorker.WorkerSupportsCancellation = true;

            myWorker.DoWork += new DoWorkEventHandler(myWork_DoWork);
            myWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
            myWorker.ProgressChanged += new ProgressChangedEventHandler(myWorker_ProgressChanged);
        }
        #endregion

        #region backgroundworker DoWork event
        void myWork_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker sendingWorker = sender as BackgroundWorker;
            object[] arrObjects = e.Argument as object[];

            int maxValue = (int)arrObjects[0];
            StringBuilder sb = new StringBuilder();

            float percentage = 0;
            for (int i = 0; i <= maxValue; i++)
            {
                sb.Append(string.Format("Counting number : {0}{1}", PerformHeavyOperation(i), Environment.NewLine));
                percentage = 100 / (float)maxValue * i;
                sendingWorker.ReportProgress((int)percentage);

                if (sendingWorker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
            }

            e.Result = sb.ToString();
        }
        #endregion

        #region backgroundworker RunWorkerCompleted event
        void myWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                lblStatus.Text = "User Cancelled";
            }
            else if (e.Error != null)
            {
                txtResult.Text = e.Error.ToString();
                lblStatus.Text = "Error";
            }
            else
            { 
                string result = e.Result.ToString();
                txtResult.Text = result;
                lblStatus.Text = "Done";
            }
        }
        #endregion

        #region backgroundworker ProgressChanged event
        void myWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lblStatus.Text = string.Format("Counting number : {0} %...", e.ProgressPercentage.ToString());
        }
        #endregion

        #region simulate heavy work
        private int PerformHeavyOperation(int i)
        {
            System.Threading.Thread.Sleep(100);
            return i * 1000;
        }
        #endregion

        #region start buton click method
        private void btnStart_Click(object sender, EventArgs e)
        {
            int numericValue = (int)this.numericUpDown.Value;
            object[] arrObjects = new object[] { numericValue };

            if (!myWorker.IsBusy)
            {
                if (!string.IsNullOrEmpty(txtResult.Text))
                    txtResult.Text = "";

                myWorker.RunWorkerAsync(arrObjects);
            }
            else
                lblStatus.Text = "Work processing";
        }
        #endregion

        #region clear click method
        private void btnClear_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Clear data?", "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                txtResult.Text = "";
        }
        #endregion

        #region cancel buton click method
        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (myWorker.IsBusy)
            { 
                myWorker.CancelAsync();
            }
            else
            {
                lblStatus.Text = "No cancel work";
            }
        }
        #endregion

1번 예제 소스 :

BackgroundWorker1.zip

 

2번 예제 소스 :

BackgroundWorker2.zip


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

멀티플(multiple) 윈도우 - 2  (0) 2015.05.07
데이타베이스 라이브러리  (0) 2015.04.22
텍스트 로그 파일 라이브러리 - 3  (0) 2015.02.21
텍스트 로그 파일 라이브러리 - 2  (0) 2015.02.21
멀티플(multiple) 윈도우 - 1  (0) 2015.01.24
posted by 따시쿵
2015. 2. 25. 17:31 C# with UDP/IP

브로드캐스트는 같은 물리적 네트워크 상에 있는 받을 준비가 되어 있는 모든 컴퓨터에게 메시지를 전송하는 기법입니다. 기본적으로 라우터나 게이트웨이는 BROADCAST 메시지를 전달하지 않습니다.


브로드캐스트의 또 다른 제약사항은 인터페이스의 최대 전송 단위(maximum transmission unit, MTU)를 넘지 않는다는 겁니다. 기본적으로 브로드캐스트 패킷은 최대 전송 단위를 초과할 수 없습니다.

예를 들어 1460 (1500 - 20 (IP Header) - 20 (UDP Header)) 과 같습니다.


브로드캐스트 주소는 255.255.255.255 이거나 network broadcast address 입니다.

(예전의 브로드캐스트 주소인 0.0.0.0 은 현재는 네트워크 주소로 사용되고 있습니다.

예를 들어, 당신의 컴퓨터 주소가 192.168.20.0 이고 넷마스크가 255.255.255.0 이라면, 브로드캐스트 주소는 192.168.20.255 입니다. (192.168.20.0 might work for backward compatibility) 


당신의 IP address, netmask를 알고 있다면 다음의 공식을 이용해서 산출할 수 있습니다.

Your Broadcast address is: < IP Address > | ( ˜ Netmask ) 


이론적으로 브로드캐스트에 대한 이해를 돕기 위해서는 아래의 사이트를 참조하시기 바랍니다.

Internetwork Design Guide -- UDP Broadcast Flooding

Broadcasting and Multicasting

UDP 통신 시 브로드캐스트 IP 셋팅하기



브로드캐스트시 IP 셋팅 방법은 아래와 같습니다.


IP 주소의 서브넷 부분을 제외한 호스트 자리를 2진수 1로 채운 것을 말합니다.


1.

제품의 IP주소가 공장 초기 값인 10.1.0.1 이고 서브넷 마스크가 255.0.0.0 이라고 한다면,

네트워크 자리는 10. 까지이며 호스트 주소가 1.0.1 이 부분이 서브넷 마스크가 0.0.0 이기 때문에 

그 부분의 2진수를 1로 다 채우게 되면 10.255.255.255가 되겠습니다.

http://blog.sollae.co.kr/?p=691


2.

제품 IP주소가 192.168.0.100 이고, 서브넷 마스크가 255.255.255.0인 경우는 브로드캐스트 IP가 무엇이 될까요

바로 192.168.0.255입니다. 서브넷 마스크가 나타내는 네트워크 자리는 192.168.0.이며 호스트 자리는 100입니다.

호스트자리를 전체 1로 다 채우면 255가 되겠습니다.

http://blog.sollae.co.kr/?p=691


3.

172 대역을 살펴보겠습니다.

제품 IP주소가 172.16.0.100 이고 서브넷 마스크가 255.255.254.0인 경우의 브로드캐스트 IP는 바로 172.16.1.255입니다.

http://blog.sollae.co.kr/?p=691


4.

ip 주소가 255.255.255.255 를 사용합니다. 같은 물리적 네트워크상의 모든 컴퓨터에게 메시지를 전송합니다.

http://www.tack.ch/multicast/broadcast.shtml



프로그램 설명


sender 가 UdpClient 를 생성하여 broadcast IP 인 255.255.255.255 주소로 메시지를 전송하고, receiver 에서는 메시지 받는 루틴을 만들어서 sender 가 전송한 메시지를 받아서 화면에 보여 줍니다.



실행 후






메시지 전송 후






프로그램 작성 순서


1. sender 프로그램


UDPer class define

    class UDPer
    {
        private const int PORT_NUMBER = 15000;

        public void Send(string message)
        {
            UdpClient client = new UdpClient();
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT_NUMBER);
            client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            byte[] bytes = Encoding.UTF8.GetBytes(message);
            client.Send(bytes, bytes.Length, ip);
            client.Close();

            if (OnSendMessage != null)
                OnSendMessage(message);
        }

        public delegate void SendMessageHandler(string message);
        public event SendMessageHandler OnSendMessage;
    }


Windows Form define

        UDPer udper = null;
        public SendForm()
        {
            InitializeComponent();

            udper = new UDPer();
            udper.OnSendMessage += new UDPer.SendMessageHandler(udper_OnSendMessage);
        }

        void udper_OnSendMessage(string message)
        {
            Trace.WriteLine(string.Format("sent messge : {0}", message));
            lblResult.Text = message;
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            udper.Send(textBox1.Text);
        }


2. receiver 프로그램


UDPer class define

    class UDPer
    {
        private const int PORT_NUMBER = 15000;

        private UdpClient udp = null;
        IAsyncResult ar_ = null;
        
        public void Start()
        {
            if (udp != null)
            {
                throw new Exception("Alread started, stop first");                
            }

            udp = new UdpClient();

            IPEndPoint localEp = new IPEndPoint(IPAddress.Any, PORT_NUMBER);

            udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            udp.ExclusiveAddressUse = false;
            udp.Client.Bind(localEp);

            StartListening();
        }

        public void Stop()
        {
            try
            {
                if (udp != null)
                {
                    udp.Close();
                    udp = null;
                }
            }
            catch { }
        }

        private void StartListening()
        {
            ar_ = udp.BeginReceive(Receive, new object());
        }

        private void Receive(IAsyncResult ar)
        {
            try
            { 
                if (udp != null)
                { 
                    IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT_NUMBER);
                    byte[] bytes = udp.EndReceive(ar, ref ip);
                    string message = Encoding.UTF8.GetString(bytes);
                    StartListening();

                    if (OnReceiveMessage != null)
                        OnReceiveMessage(message);
                }
            }
            catch(SocketException se)
            {
                Trace.WriteLine(string.Format("SocketException : {0}", se.Message));
            }
            catch(Exception ex)
            {
                Trace.WriteLine(string.Format("Exception : {0}", ex.Message));
            }
        }

        public delegate void ReceiveMessageHandler(string message);
        public event ReceiveMessageHandler OnReceiveMessage;

    }


Windows Form define

        UDPer udper = null;
        bool isBtnCommandEnabled = true;
        public ReceiveForm()
        {
            InitializeComponent();

            udper = new UDPer();
            udper.OnReceiveMessage += new UDPer.ReceiveMessageHandler(udper_OnReceiveMessage);

        }

        protected override void OnClosed(EventArgs e)
        {
            if (udper != null)
                udper.Stop();

            base.OnClosed(e);
        }

        void udper_OnReceiveMessage(string message)
        {
            Trace.WriteLine(string.Format("received message : {0}", message));
            Invoke((MethodInvoker)delegate
            {
                lblReceive.Text = message;
            });
        }

        private void btnCommand_Click(object sender, EventArgs e)
        {
            if (isBtnCommandEnabled)
            { 
                udper.Start();
                UpdateUI(isBtnCommandEnabled);
                isBtnCommandEnabled = false;                
            }
            else
            {
                udper.Stop();                
                UpdateUI(isBtnCommandEnabled);
                isBtnCommandEnabled = true;
            }
        }

        private void UpdateUI(bool isBool)
        {
            if (isBool)
            {
                this.btnCommand.Text = "Stop the UDP Client";
                this.btnCommand.ForeColor = Color.White;
                this.btnCommand.BackColor = Color.Orange;
            }
            else
            {
                this.btnCommand.Text = "Stop the UDP Client";
                this.btnCommand.ForeColor = SystemColors.ControlText;
                this.btnCommand.BackColor = SystemColors.Control;
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (udper != null)
                udper.Stop();

            this.Close();
        }


posted by 따시쿵
prev 1 2 3 4 5 6 7 8 ··· 12 next