【C#】 Socket通信プログラムで最低限必要な事とHello World!するまでを解説。

#自己紹介
こんにちは。tetraです。
最近C#の学習を始めました。C#歴4ヶ月目の新卒エンジニアです。
サーバーとクライアントで通信プログラムを作成する事になりました。全くやり方が分からなかったので、同じ思いをする人の支えになればいいと思い作成しました。

#この記事でわかること
1. ソケット通信プログラムを作成する際、最低限必要なことが分かる。
1. サーバーサイドで何をするべきか分かる。
1. クライアントサイドで何をするべきか分かる。

#知っておくべきこと
『クライアント』『サーバー』の概念があり、相互で通信を行う。
##サーバーサイド
- ソケットを作成する。
- ソケットにポート番号を割り当てる。
- クライアントから接続要求を受けた時に受け入れる準備をしておく。
- 〜計算などやりたい処理を行う。〜（今回はHello World!を受け取り、HELLO WORLD!にして返す。）
- ソケットを削除し、終了。


##クライアントサイド
- ソケットの作成
- サーバーとの接続を確立する。
- 〜やりたい処理を行う。〜（今回はHello World!を送り、HELLO WORLD!を受け取る。）
- ソケットを削除し終了。

#完成形
##サーバーサイド

```c#:server.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace socketS
{
    class S
    {
        public static void Main()
        {
            SocketServer();
        }

        public static void SocketServer()
        {
            //ここからIPアドレスやポートの設定
            // 着信データ用のデータバッファー。
            byte[] bytes = new byte[1024];
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
            //ここまでIPアドレスやポートの設定

            //ソケットの作成
            Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            //通信の受け入れ準備
            listener.Bind(localEndPoint);
            listener.Listen(10);

            //通信の確率
            Socket handler = listener.Accept();


            // 任意の処理
            //データの受取をReceiveで行う。
            int bytesRec = handler.Receive(bytes);
            string data1 = Encoding.UTF8.GetString(bytes, 0, bytesRec);
            Console.WriteLine(data1);

            //大文字に変更
            data1 = data1.ToUpper();

            //クライアントにSendで返す。
            byte[] msg = Encoding.UTF8.GetBytes(data1);
            handler.Send(msg);

            //ソケットの終了
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
    }
}
```

##クライアントサイド
```C#:client.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace socketC
{
    class C
    {
        public static void Main()
        {
            //今回送るHello World!
            string st = "Hello World!";
            SocketClient(st);
        }


        public static void SocketClient(string st)
        {
            //IPアドレスやポートを設定している。
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

            //ソケットを作成
            Socket socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            //接続する。失敗するとエラーで落ちる。
            socket.Connect(remoteEP);

            //Sendで送信している。
            byte[] msg = Encoding.UTF8.GetBytes(st + "<EOF>");
            socket.Send(msg);

            //Receiveで受信している。
            byte[] bytes = new byte[1024];
            int bytesRec = socket.Receive(bytes);
            string data1 = Encoding.UTF8.GetString(bytes, 0, bytesRec);
            Console.WriteLine(data1);

            //ソケットを終了している。
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }
}
```


#いかがでしょうか？
いかがでしょうか。経験が浅いため至らぬところがまだまだあります。
もし間違い等に気がつきましたら、コメント又は[tetra](https://twitter.com/_T_E_T_R_A_)までお知らせください。