C#のTCP / IPサーバーとクライアント

サーバー
、システムを使用して
System.Collections.Genericを使用して、
System.Textのを使用して、
System.Threadingを使用して、
System.Net.Socketsを使用して、
System.Netを使用して、

名前空間TcpIpServer
{
クラスTcpIpServerEx
{
公共RemoteEndPointエンドポイント{GET;プライベートSET;} //現在のクライアントのネットワークノードの

スレッドthreadwatch = NULL; //クライアントがスレッド監視する責任がある
ソケットソケット=ヌル; //クライアントが監視ソケットを担当して
//辞書<IPとポート、ソケット>セットを定義し、店舗の顧客終了情報
辞書<エンドポイントソケット> DIC =新たな新しい辞書<エンドポイントソケット> {}公共、

プライベートのStringBuilder StringBuilderの新しい新MSG =();
パブリック文字メッセージ
{
GET msg.ToString {リターン();}
プライベートSET
{
msg.AppendLine(値);
Console.WriteLineを(値+ "\ R&LT \ N-");
}

}

プライベートTcpIpServerEx(){}
公共TcpIpServerEx(ポート= 11000 INT)
{
//クライアントをリッスンするソケットを画定します送信されたメッセージは、三つのパラメータ(IP4アドレス指定プロトコル、ストリーミング接続、TCPプロトコル)が含まれ
、ソケット新しい新しい=ソケット(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp)

//ポート番号とIPアドレスのバインディングをネットワーク・ノード・ポイントに
IPEndPoint IPEndPoint新しい新しいポイント=(IPAddress.Any、ポート); //サーバポートを設定し、IPはPC現在の手順IPネットワークで

結合スヌーピング//ネットワークノード
Socket.bind(ポイントを);

/ /ソケットがリッスンキュー長は20に制限され
socket.Listen(20);

//リスナースレッド作成
threadwatch =新しい新しいスレッド(watchconnecting);

//スレッドの形態を背景に同期させるために、メインスレッドが終了すると共に最後
trueに= threadwatch.IsBackground;

//スレッド開始
threadwatch.Startを();

スレッドを開始した後、//対応するプロンプトを表示
メッセージ=(「クライアントが来る情報のリッスンを開始します!」+「\ R&LT \ N-を」);
}

//リスニングクライアント要求が送信された
プライベート・ボイドwatchconnecting()
{
ソケット接続を=ヌル;
しばらくは(真の)継続的要求にクライアントを監視//
{
試み
{
;接続socket.Accept =()
}
キャッチ(例外EX)
{
メッセージ=(ex.Message); //ヒントは、ソケットをリスニング異常
BREAK;
}

//顧客が「接続成功」のメッセージを表示することができ
、文字列にsendmsg = + connection.RemoteEndPoint「あなたのIPの成功があるサーバーに接続を!」;
バイト[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsgの);
接続.send(arrSendMsg);


RemoteEndPoint = connection.RemoteEndPoint; //クライアント・ネットワーク・ノード番号
メッセージ=( "成功"、 "クライアント接続確立\トンの\ nを!" + RemoteEndPoint +);クライアントと//ディスプレイ接続
dic.Add(RemoteEndPoint、接続); //クライアント情報を追加する


通信スレッドの作成//
; ParameterizedThreadStart PTS =新新ParameterizedThreadStart(RECV)
スレッドスレッド=新しい新しいスレッド(PTS);
thread.IsBackground = trueに; //設定された背景をスレッド、終了とメインスレッドが終了
thread.Start(接続); //スレッドを開始
}
}

///
///クライアントから送信された情報受信
///
///クライアントソケットオブジェクト
のプライベートボイドRECVを(オブジェクトsocketclientpara)
{

ソケットSocketServerのsocketclientparaソケットは=として、
一方(真の)
{
//作成メモリ・バッファ・サイズは、バイト、すなわち、1Mの1024 * 1024
バイト[] = arrServerRecMsg新しい新しいバイト[* 1024 1024];
//う受信された情報は、メモリバッファに格納され、アレイのバイト長戻る
試みを
{
socketServer.Receive長= INT(arrServerRecMsg);

//機械受信バイト配列人間が読める文字列に
文字列strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg、0 、長さ);

文字が//送信しますテキストボックスtxtMsgに取り付けられた文字列情報
(:+ GetCurrentTime()+ socketServer.RemoteEndPoint "クライアント"メッセージ= + " メッセージ:" + strSRecMsg + "\ R&LT \ N-");
}
キャッチ(例外EX)
{
メッセージ= ( "クライアント:" + GetCurrentTime()+ socketServer.RemoteEndPoint +は、 " + "\ rを\ n"を切断されている" ); // リスニングソケットプロンプト異常
//listBoxOnlineList.Items.Remove(socketServer.RemoteEndPoint.ToString ()); //リストボックスのクライアントから切断削除
socketServer.Close(); //手仕舞いとクライアントソケット通信の前に受け入れ
ブレーク。
}
}


}


//現在のシステム時刻を取得する
プライベートGetCurrentTime文字列()
{
文字列timeStr = System.DateTime.Now.ToString( "YYYY、MM月DD日のHHのミリメートルSS FFFミリ秒。");
TIMESTRのリターン;
}

/// <要約>
///がクライアントに情報を送信する
// / </要約>
/// <PARAM NAME = "smallname"> </ PARAM>
/// <PARAM NAME = "SENDMSG">情報を送信する</ PARAM>
公共ボイドSentMsgポイント(エンドポイント、エンドポイント、文字列SENDMSG)
{

バイト[]バイト= System.Text.Encoding.UTF8.GetBytes(SENDMSG ); // ソケットは、送信されるバイトの形式でデータを送信するための情報は、バイト配列に送信される
DIC [なendPoint] .Send(バイト); //データを送信する
"メッセージ:"メッセージ=(GetCurrentTime()SENDMSG + + + +エンドポイントを、 "\ R&LT \ N-");
}
}
}

システムを使用して、
名前空間TcpIpServer
{
クラスプログラム
{
静的な無効メイン(文字列[] args)
{
S =新しい新しいTcpIpServerEx TcpIpServerEx();
一方、(真の)
{
文字列strSend Console.ReadLine =();
IF(strSend == "終了")BREAK;
Console.WriteLineを( "s.dic.Count:" + s.dic。 COUNT);
IF(s.dic.Count> 0)
{
s.SentMsg(s.RemoteEndPoint、strSend);
}
}
}
}
}
クライアント
システムを使用して;
System.Collections.Genericを使用して、
System.Textのを使用して、
システムを使用して。 ;スレッド
;使用してSystem.Net.Socketsを
使用してSystem.Net;

名前空間TcpIpClint
{
publicクラスのTcpIpClintEx
{
//クライアントソケットを作成し、要求がサーバスレッドの監視を担当している
スレッドthreadclient = NULLを。
ソケット= NULLソケット;
リスト<IPEndPoint> = mlist新しい新しいリスト<IPEndPoint>();
プライベートのStringBuilder StringBuilderの新しい新MSG =();
パブリック文字メッセージ
{
GET msg.ToString {リターン();}
プライベートSET
{
msg.AppendLine(値);
Console.WriteLineを(値+ "\ R&LT \ N-");
}
}

パブリックTcpIpClintEx(文字列IP、ポート= 11000 INT)
{
//ソケットリスナの定義
ソケット=新しいソケット(AddressFamily.InterNetwork、SocketType.Stream 、ProtocolType.Tcp);
//結合ネットワークノード上取得したIPアドレスとポート番号
IPEndPoint IPEndPoint新しい新しいポイント=(IPAddress.Parse(IP)、ポート);
メッセージは= + IP +「 "サーバーへの接続": 「ポート+;

試み
{
//ネットワーク・ノードに接続されたクライアントソケット、接続して
Socket.connect(ポイント);
}
キャッチ(例外)
{
メッセージ=( "接続が\ N- R&LT \失敗");
を返す;
}

(RECV)=新しい新しいスレッドをthreadclient;
threadclient.IsBackground = trueに、
threadclient.Start();
}

@サーバーから送信された情報の受信方法
民間のボイドのrecv()が//
{
しばらくは(真の)//サーバは、継続的に送信されるメッセージを監視
{
試して
{
//一時的に格納するための1Mバッファメモリの定義受信したメッセージ
のバイト[] = arrRecvmsg新しい新しいバイト[* 1024 1024];

//クライアントソケットは、メモリバッファにデータを受信し、長得る
INT長= Socket.Receive(arrRecvmsgを);

//ヒトの取得された文字列にソケットアレイは理解できる
文字列strRevMsg = Encoding.UTF8.GetString(arrRecvmsg、0 、長さ)。

MSG =( "サーバー" + GetCurrentTime()+ " IP:" + socket.RemoteEndPoint + " メッセージ:" + strRevMsg + "\ R&LT \ N- \ N-");
}
キャッチ(例外EX)
{
MSG =( "\ R&LT \ N-")+ "リモートサーバが切断されました";
ブレーク;
}
}
}

//現在のシステム時刻を取得
プライベートGetCurrentTime文字列()
{
TIMESTR = System.DateTime.Now.ToString(「YYYY、MM-DDの文字列ときミリメートル端数日のHH SSはミリ秒の秒FFF「);.
TIMESTRのリターン;
}

//サーバプロセスに文字情報を送信する
公共ボイドClientSendMsg(文字列SENDMSG)
{
コンテンツ//文字列の入力バイトはマシンを識別することができる変換アレイの
バイト[] = arrClientSendMsg Encoding.UTF8.GetBytes(SENDMSG);
//は、送信されたバイトのクライアントソケットアレイに呼び出し
socket.Send(arrClientSendMsg)。
}
}
}
システムを使用しました。
System.Collections.Genericを使用しました。
System.Textのを使用しました。

名前空間TcpIpClint
{
クラスプログラム
{
静的な無効メイン(文字列[] args)
{
TcpIpClintEx tcpIpClintEx =新TcpIpClintEx( "122.112.226.109")。

(真)一方
{
ストリングstrSend = Console.ReadLine();
もし(strSend ==「終了」)ブレイク。
tcpIpClintEx.ClientSendMsg(strSend)。
}
}
}
}
----------------

原文链接:HTTPS://blog.csdn.net/u013628121/article/details/82968706

おすすめ

転載: www.cnblogs.com/zhengguangITelite/p/11388386.html