C#のソケット通信のサンプルです。
目次
サンプル | ソケット通信とは |
サンプルコードの説明 | |
サーバー側のコード | |
クライアント側のコード | |
実行して確認する |
ソケット通信とは
- ソケットは、OSに実装されている機能です。
- IPアドレスとポート番号を指定して通信します。
- サーバー側は待ち状態で起動します。
- クライアント側はサーバー側に接続しに行きます。
- サーバー側はクライアント側から要求を受けて処理をします。
サンプルコードの説明
サーバー側とクライアント側のコードがあります。
クライアント側で、
偶数の数値を入力するとサーバーは「OK」を返します。
奇数の数値を入力するとサーバーは「NG」を返します。
数値以外を入力するとメッセージを返します。
byeと入力するとサーバー側とクライアント側の処理が終了します。
コンソールアプリ(.NET Framework)で作成しました。
server1.csがサーバー側でclient1.csがクライアント側です。
サーバー側のコード
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
namespace con1
{
// ソケット通信(サーバー側)
class server1
{
static void Main()
{
IPAddress host1 = IPAddress.Parse("127.0.0.1");
int port1 = 8765;
IPEndPoint ipe1 = new IPEndPoint(host1, port1);
TcpListener server = null;
string recvline, sendline = null;
int num, i = 0;
Boolean outflg = false;
byte[] buf = new byte[1024];
Regex reg = new Regex("\0");
try
{
server = new TcpListener(ipe1);
Console.WriteLine("クライアントからの入力待ち状態");
server.Start();
while (true)
{
using (var client = server.AcceptTcpClient())
{
using (var stream = client.GetStream())
{
while ((i = stream.Read(buf, 0, buf.Length)) != 0)
{
recvline = reg.Replace(Encoding.UTF8.GetString(buf), "");
Console.WriteLine("client側の入力文字=" + recvline);
if (recvline == "bye")
{
outflg = true;
break;
}
try
{
num = int.Parse(recvline);
if (num % 2 == 0)
{
sendline = "OKです";
}
else
{
sendline = "NGです";
}
}
catch
{
sendline = "数値を入力して下さい";
}
finally
{
buf = Encoding.UTF8.GetBytes(sendline);
stream.Write(buf, 0, buf.Length);
Array.Clear(buf, 0, buf.Length);
}
}
}
}
if (outflg == true)
{
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
server.Stop();
Console.WriteLine("サーバー側終了です");
}
}
}
}
16行目は、サーバーのIPアドレスとポート番号をセットしています。
21行目は、バイト配列のサイズを指定しています。
34行目は、クライアントから送信された文字列を受け取ります。bufにバイト配列でセットされます。
36行目は、クライアントから受け取ったデータの後にnull文字(0x00)が入るのでReplaceで削除しています。
38行目は、クライアントからbyeの文字列を受け取った時にループを終了します。
46行目からは、クライアントから受け取った数字を判定して文字列をセットしています。
61行目からは、セットした文字列をバイト配列にしてクライアント側に送信しています。
クライアント側のコード
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
namespace con2
{
// ソケット通信(クライアント側)
class client1
{
static void Main()
{
IPAddress host1 = IPAddress.Parse("127.0.0.1");
int port1 = 8765;
IPEndPoint ipe1 = new IPEndPoint(host1, port1);
string line = "";
byte[] buf1, buf2 = new byte[1024];
Regex reg = new Regex("\0");
try
{
using (var client = new TcpClient())
{
client.Connect(ipe1);
using (var stream = client.GetStream())
{
while (line != "bye")
{
// 標準入力からデータを取得
Console.WriteLine("--------------------------");
Console.WriteLine("偶数の数値を入力して下さい");
Console.WriteLine("--------------------------");
// サーバに送信
line = Console.ReadLine();
buf1 = Encoding.UTF8.GetBytes(line);
stream.Write(buf1, 0, buf1.Length);
// サーバから受信
stream.Read(buf2, 0, buf2.Length);
Console.WriteLine(
reg.Replace(Encoding.UTF8.GetString(buf2), ""));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("クライアント側終了です");
}
}
}
}
15行目は、サーバーのIPアドレスとポート番号をセットしています。
17行目は、バイト配列のサイズを指定しています。送信用と受信用の変数があります。
34行目は、コマンドプロンプトで入力した値を受け取ります。
35行目は、バイト配列にしています。
36行目は、サーバーに値を送信しています。buf1に値が入っています。
39行目は、サーバーからの値を受信します。buf2に値が入っています。
41行目は、サーバーから受け取ったデータの後にnull文字(0x00)が入るのでReplaceで削除しています。
実行して確認する
1.exeファイルを作成します。作成方法は以下を参照願います。
Visual Studio exeファイルを作成する方法
2.exeファイルを任意の場所に配置します。その後、コマンドプロンプトを2つ立ち上げ、先にサーバー側のcon1.exeを起動し、次にクライアント側のcon2.exeを起動します。
3.以下はサーバー側の実行結果です。
4.以下はクライアント側の実行結果です。
関連の記事