簡単にどのようにソケット類を使って接続に向けた通信を実現しますか?

3480 ワード

この例は単にソケット類を使って接続に向けた通信を実現しただけです。
この例の目的は、実際のプロジェクトではなく、ソケットでプログラムを書く大体の考えを説明するためだけです。この例では、メッセージ境界問題、ポート番号が占有されているか、メッセージコマンドの解析問題など、実際には解決されていない問題が多い。
以下は二つのプログラムのコードです。
まずサービスエンドの(Server)完全コードを送ってください。
名前空間をインポート:
[csharp]view plinCopy print?using System.Net.Sockets;using System.Net;using System.Threading;
完全コードは以下の通りです。
[csharp]view play copy print?namespace SocketServer{class Protram{prvate static byte}relt=new byte[1024];prvate static myPrott=8885;/ポートstatic Socket server Socket;start voriseサーバ127(Address Family.InterNetwork,SocketType.Stream,ProtocolType.Tcp);serverSockett.Bind(new IPEntPoint(ip,myPrott));/バインディングIPアドレス:ポートserver Sockete.Listen(10);/設定は最大10個のキューイング接続要求Conline.End.";//Clientsoketを通してデータThread myThread=new Thread(ListenClientConnect);myThread.Start();Cosone.ReadLine();
    ///   
    ///          
    ///   
    private static void ListenClientConnect()  
    {  
        while (true)  
        {  
            Socket clientSocket = serverSocket.Accept();  
            clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));  
            Thread receiveThread = new Thread(ReceiveMessage);  
            receiveThread.Start(clientSocket);  
        }  
    }  

    ///   
    ///       
    ///   
    ///   
    private static void ReceiveMessage(object clientSocket)  
    {  
        Socket myClientSocket = (Socket)clientSocket;  
        while (true)  
        {  
            try  
            {  
                //  clientSocket      
                int receiveNumber = myClientSocket.Receive(result);  
                Console.WriteLine("     {0}  {1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));  
            }  
            catch(Exception ex)  
            {  
                Console.WriteLine(ex.Message);  
                myClientSocket.Shutdown(SocketShutdown.Both);  
                myClientSocket.Close();  
                break;  
            }  
        }  
    }  
}  
)
以上はサービスエンドの完全なコードです。
クライアントの完全なコードは以下の通りです。
名前空間をインポート:
[csharp]view plinCopy print?using System.Net;using System.Net.Sockets;using System.Threading;
完全コード:
namespace SocketCient{class Program{prvate static byte[]reult=new byte[1024];static void Main{string[]args){/設定サーバIPアドレスIPAddres ip=IPddess.Padestrerects.packttttttdededededededededededestrereress.packtttttttttttttttttttttttttttdedededededededededededededededededededededededededededededededededededededededededededededededededestststststststrecolType.Tcp);try{clientSocketc.Connect(new IPEntdPoint(ip,8885)、/コンフィギュレーションサーバIPとポートConsolite.Writeline(「接続サーバ成功」)}catch{Consoliteline.Writeline)/Return/clientSocketでデータを受信する。サーバメッセージの受信:{0}Enccoding.ASCII.GetString,///clientSocketでデータfor(int i=0;i+i){try{Thread. Sleep(1000)//1秒を待つstininindedededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededeMessage);Consone.WriteLine(「サーバにメッセージを送る:{0}」+sendMessage);catch{client Sockett.Shutdown(SocketShutdown.Both);clientSocketc.Close();break;)Consolite.WriteLine(「送信完了、リターンキーで退出」);
コンパイルが成功したら、まずサービスを実行し、クライアントを実行すれば通信効果が得られます。効果は下図のようです。
このプログラムはLANでテストされました。(192.168.X.X)