블로그 이미지
따시쿵

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 31

Notice

2015. 1. 9. 07:51 C# with TCP/IP

프로그램 설명


msdn 에 있는 예제를 가지고 만든 버전입니다.


TcpListener 클래스 

http://msdn.microsoft.com/ko-kr/library/system.net.sockets.tcplistener(v=vs.110).aspx


TcpClient 클래스

http://msdn.microsoft.com/ko-kr/library/system.net.sockets.tcpclient(v=vs.110).aspx


클라이언트 버전은 사용자 입력을 반복적으로 입력받을 수 있게 수정했습니다.


클라이언트의 메시지를 서버가 받아서 대문자로 변경해 주는 작업만 처리합니다.


실행 후



메시지 전송 후




프로그램 작성 순서


1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;


2. 서버 프로그램


        static void Main(string[] args)
        {
            TcpListener server = null;

            try
            {
                // Set the TcpListener on port 13000
                Int32 port = 14000;
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");

                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);

                // Starting listening for client requests.
                server.Start();

                // Buffer for reading data
                byte[] bytes = new byte[256];
                string data = string.Empty;

                // Enter the listening loop
                while(true)
                {
                    Console.WriteLine("Waiting for a connection...");

                    // Perform a blocking call to accept requests.
                    // You could also user server.AcceptSocket() here
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");

                    data = string.Empty;

                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();

                    int bytesRead = 0;
                    // Loop to receive all the data sent by the client
                    while( (bytesRead=stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a UTF8.
                        data = Encoding.UTF8.GetString(bytes, 0, bytesRead);
                        Console.WriteLine("Received: {0}", data);

                        // Process tha data sent by the client
                        data = data.ToUpper();

                        byte[] msg = Encoding.UTF8.GetBytes(data);

                        // Send back a response
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}\n", data);
                    }

                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch(SocketException se)
            {
                Console.WriteLine("SocketException : {0}", se.Message.ToString());
            }
            finally
            {
                // Stop listening for new clients
                server.Stop();
            }

            Console.WriteLine("\nHit enter to continue...");
            Console.Read(); 
        }

3. 클라이언트 프로그램


        static void Main(string[] args)
        {
            string sendData = string.Empty;
            do
            {
                Console.Write("\n전송할 데이타를 입력해 주세요 : ");
                sendData = Console.ReadLine();

                if (!string.IsNullOrEmpty(sendData))
                    Connect("127.0.0.1", sendData);
            } while (sendData != "");
            
            Console.WriteLine("\nPress Enter to continue...");
            Console.Read();
        }

        static void Connect(string server, string message)
        {
            try
            {
                // Create a TcpClient
                // Note, for this client to work you need to have a TcpServer
                // connected to the same address as specified by the server, port
                // combination
                Int32 port = 14000;
                TcpClient client = new TcpClient(server, port);

                // Get a client stream for reading and writing
                // Stream stream = client.GetStream() : System.IO needs..
                NetworkStream stream = client.GetStream();

                // Translate the passed message into UTF8 and store it as Byte array.
                byte[] data = Encoding.UTF8.GetBytes(message);

                // Send the message to the connected TcpServer
                stream.Write(data, 0, data.Length);

                Console.WriteLine("Sent: {0}", message);

                // Receive the TcpServer response

                // Buffer to store the response bytes.
                data = new byte[256];

                // string to store the response ASCII representation.
                string responseData = string.Empty;

                Int32 bytesRead = stream.Read(data, 0, data.Length);
                responseData = Encoding.UTF8.GetString(data, 0, bytesRead);
                Console.WriteLine("Received: {0}", responseData);

                // Close everything
                stream.Close();
                client.Close();
            }
            catch(ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e.Message.ToString());
            }
            catch(SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e.Message.ToString());
            }
        }



posted by 따시쿵
2015. 1. 6. 15:43 C# with TCP/IP

프로그램 설명


다중 접속과 데이타 전송 및 클라이언트에서 소켓 해제시 서버에서 인지를 하고 접속한 클라이언트 소켓을 해제하는 예제입니다.


구조는 서버에서 listen socket 을 생성하고, 각각의 클라이언트 접속시 client class 를 만들어서 리스트뷰에서 현재 상태의 소켓 상태와 메시지를 보여 주는 구조입니다. 


서버 구현시 사용한 listen class, client class 파일 올립니다.

Client.cs  Listener.cs

클라이언트에서는 소켓을 해제하는 단계를 거칩니다.



실행 후



메시지 전송 후



클라이언트 접속 해제 후



프로그램 설명


1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;


2. 서버 프로그램


        Listener listener;

        public Main()
        {
            InitializeComponent();

            int port = Convert.ToInt32(Properties.Settings.Default.Port);
            listener = new Listener(port);
            listener.SocketAccepted += new Listener.SocketAcceptedHandler(listener_SocketAccepted);
            Load += new EventHandler(Main_Load);
        }

        void Main_Load(object sender, EventArgs e)
        {
            string tcpServerIP = Properties.Settings.Default.ServerIP;
            listener.Start(tcpServerIP);
        }

        void listener_SocketAccepted(System.Net.Sockets.Socket e)
        {
            Client client = new Client(e);
            client.Received += new Client.ClientReceivedHandler(client_Received);
            client.Disconnected += new Client.ClientDisconnectedHandler(client_Disconnected);

            Invoke((MethodInvoker)delegate
            {
                ListViewItem i = new ListViewItem();
                i.Text = client.EndPoint.ToString();
                i.SubItems.Add(client.ID);
                i.SubItems.Add("XX");
                i.SubItems.Add("YY");
                i.Tag = client;
                lstClient.Items.Add(i);
            });
        }

        void client_Disconnected(Client sender)
        {
            Invoke((MethodInvoker)delegate
            {                
                for (int i = 0; i < lstClient.Items.Count; i++)
                {
                    Client client = lstClient.Items[i].Tag as Client;

                    if (client.ID == sender.ID)
                    {
                        lstClient.Items.RemoveAt(i);
                        break;
                    }
                }
            });
        }

        void client_Received(Client sender, byte[] data)
        {
            Invoke((MethodInvoker)delegate
            {
                for (int i = 0; i < lstClient.Items.Count; i++)
                {
                    Client client = lstClient.Items[i].Tag as Client;

                    if (client.ID == sender.ID)
                    {
                        lstClient.Items[i].SubItems[2].Text = Encoding.UTF8.GetString(data);
                        lstClient.Items[i].SubItems[3].Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                        break;
                    }
                }
            });
        }


3. 클라이언트 프로그램


        Socket sck;
        public Main()
        {
            InitializeComponent();
            sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            string ServerIP = Properties.Settings.Default.ServerIP;
            string Port = Properties.Settings.Default.Port;

            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ServerIP), Convert.ToInt32(Port));
            sck.Connect(remoteEP);
            lblInfo.Text = "Connected";
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            int s = sck.Send(Encoding.UTF8.GetBytes(textBox1.Text));
            if (s > 0)
            {
                lblInfo.Text = string.Format("{0} bytes data sent", s.ToString());
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            lblInfo.Text = "Not Connected....";
            sck.Close();
            sck.Dispose();
            Close();
        }


posted by 따시쿵
2015. 1. 3. 09:34 C# with TCP/IP

프로그램 설명


이번 프로그램에서는 클라이언트가 다중으로 접속하는 것을 다루되도록 하겠습니다.


클라이언트는 서버에 접속을 하고 접속을 끊어 버리는 단순한 작업을 합니다. 서버는 연결이 들어오는 것을 어떻게 저장하고 관리하는지를 보여 줍니다.


서버 프로그램에서 사용하는 Listener class 파일을 첨부 파일과 환경 파일에 아이피와 포트를 저장하고 사용합니다. 두가지 모두 올립니다.


Listener.cs   Settings.cs


실행 후



연결 요청 후


프로그램 작성 순서


1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;


2. 서버 프로그램


        static Listener l;
        static List<socket> sockets;

        static void Main(string[] args)
        {
            System.Diagnostics.Debug.WriteLine("{0} : {1}", Properties.Settings.Default.ServerIP, Properties.Settings.Default.Port);
            string serverIP = Properties.Settings.Default.ServerIP;
            string port = Properties.Settings.Default.Port;

            l = new Listener(Convert.ToInt32(port));
            sockets = new List<socket>();

            l.SocketAccepted += new Listener.SocketAcceptedHandler(l_SocketAccepted);
            l.Start(serverIP);

            Console.ReadLine();
        }

        static void l_SocketAccepted(System.Net.Sockets.Socket e)
        {
            Console.WriteLine("New Connection: {0}\n{1}\n=========================", 
                                e.RemoteEndPoint.ToString(), DateTime.Now.ToString());

            if (e != null)
                sockets.Add(e);

            int index = 1;
            Console.WriteLine("Connected socket list\n=========================");
            foreach(Socket s in sockets)
            {
                Console.WriteLine("{0} : {1} : socket handle {2}", index, s.RemoteEndPoint.ToString(), s.Handle.ToString());
                index++;
            }

            Console.WriteLine("");
        }


3. 클라이언트 프로그램


            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            string serverIP = Properties.Settings.Default.ServerIP;
            string port = Properties.Settings.Default.Port;

            s.Connect(IPAddress.Parse(serverIP), Convert.ToInt32(port));
            s.Close();
            s.Dispose();



posted by 따시쿵