1. 程式人生 > >C#版 Socket程式設計(最簡單的Socket通訊功能)

C#版 Socket程式設計(最簡單的Socket通訊功能)

 示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊;這裡只是一個簡單的示例,是一個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。
下面是示例程式的簡單步驟說明
伺服器端:
第一步:用指定的埠號和伺服器的ip建立一個EndPoint對像;
第二步:建立一個Socket對像;
第三步:用socket對像的Bind()方法繫結EndPoint;
第四步:用socket對像的Listen()方法開始監聽;
第五步:接受到客戶端的連線,用socket對像的Accept()方法建立新的socket對像用於和請求的客戶端進行通訊;
第六步:通訊結束後一定記得關閉socket;


服務端程式碼:

[csharp] view plain copy print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Net;  
  7. using System.Net.Sockets;  
  8. namespace server  
  9. {  
  10.     class Program  
  11.     {  
  12.         staticvoid Main(string[] args)  
  13.         {  
  14.              int port = 2000;  
  15.             string host = "127.0.0.1";  
  16.        ///建立終結點(EndPoint)
  17.             IPAddress ip = IPAddress.Parse(host);//把ip地址字串轉換為IPAddress型別的例項
  18.             IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的埠和ip初始化IPEndPoint類的新例項
  19.          ///建立socket並開始監聽
  20.             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一個socket對像,如果用udp協議,則要用SocketType.Dgram型別的套接字
  21.             s.Bind(ipe);//繫結EndPoint對像(2000埠和ip地址)
  22.             s.Listen(0);//開始監聽
  23.             Console.WriteLine("等待客戶端連線");  
  24.          ///接受到client連線,為此連線建立新的socket,並接受資訊
  25.             Socket temp = s.Accept();//為新建連線建立新的socket
  26.             Console.WriteLine("建立連線");  
  27.             string recvStr = "";  
  28.             byte[] recvBytes = newbyte[1024];  
  29.             int bytes;  
  30.             bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受資訊
  31.             recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);  
  32.          ///給client端返回資訊
  33.             Console.WriteLine("server get message:{0}", recvStr);//把客戶端傳來的資訊顯示出來
  34.             string sendStr = "ok!Client send message successful!";  
  35.             byte[] bs = Encoding.ASCII.GetBytes(sendStr);  
  36.             temp.Send(bs, bs.Length, 0);//返回資訊給客戶端
  37.             temp.Close();  
  38.             s.Close();  
  39.             Console.ReadLine();  
  40.         }  
  41.     }  
  42. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
             int port = 2000;
            string host = "127.0.0.1";

       ///建立終結點(EndPoint)
            IPAddress ip = IPAddress.Parse(host);//把ip地址字串轉換為IPAddress型別的例項
            IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的埠和ip初始化IPEndPoint類的新例項

         ///建立socket並開始監聽
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一個socket對像,如果用udp協議,則要用SocketType.Dgram型別的套接字
            s.Bind(ipe);//繫結EndPoint對像(2000埠和ip地址)
            s.Listen(0);//開始監聽
            Console.WriteLine("等待客戶端連線");

         ///接受到client連線,為此連線建立新的socket,並接受資訊
            Socket temp = s.Accept();//為新建連線建立新的socket
            Console.WriteLine("建立連線");
            string recvStr = "";
            byte[] recvBytes = new byte[1024];
            int bytes;
            bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受資訊
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

         ///給client端返回資訊
            Console.WriteLine("server get message:{0}", recvStr);//把客戶端傳來的資訊顯示出來
            string sendStr = "ok!Client send message successful!";
            byte[] bs = Encoding.ASCII.GetBytes(sendStr);
            temp.Send(bs, bs.Length, 0);//返回資訊給客戶端
            temp.Close();
            s.Close();
            Console.ReadLine();
        }
    }
}

server結果:


客戶端:
第一步:用指定的埠號和伺服器的ip建立一個EndPoint對像;
第二步:建立一個Socket對像;
第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為引數,向伺服器發出連線請求;
第四步:如果連線成功,就用socket對像的Send()方法向伺服器傳送資訊;
第五步:用socket對像的Receive()方法接受伺服器發來的資訊 ;
第六步:通訊結束後一定記得關閉socket;
C#版 <wbr>Socket程式設計(最簡單的Socket通訊功能)


客戶端程式碼:

[csharp] view plain copy print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Net;  
  7. using System.Net.Sockets;  
  8. namespace Client  
  9. {  
  10.     class Program  
  11.     {  
  12.         staticvoid Main(string[] args)  
  13.         {  
  14.             try
  15.             {  
  16.                 int port = 2000;  
  17.                 string host = "127.0.0.1";  
  18.                 ///建立終結點EndPoint
  19.                 IPAddress ip = IPAddress.Parse(host);  
  20.                 //IPAddress ipp = new IPAddress("127.0.0.1");
  21.                 IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和埠轉化為IPEndpoint例項
  22.                 ///建立socket並連線到伺服器
  23.                 Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立Socket
  24.                 Console.WriteLine("Conneting…");  
  25.                 c.Connect(ipe);//連線到伺服器
  26.                 ///向伺服器傳送資訊
  27.                 string sendStr = "hello!This is a socket test";  
  28.                 byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字串編碼為位元組
  29.                 Console.WriteLine("Send Message");  
  30.                 c.Send(bs, bs.Length, 0);//傳送資訊
  31.                 ///接受從伺服器返回的資訊
  32.                 string recvStr = "";  
  33.                 byte[] recvBytes = newbyte[1024];  
  34.                 int bytes;  
  35.                 bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從伺服器端接受返回資訊
  36.                 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);  
  37.                 Console.WriteLine("client get message:{0}", recvStr);//顯示伺服器返回資訊
  38.                 ///一定記著用完socket後要關閉
  39.                 c.Close();  
  40.             }  
  41.             catch (ArgumentNullException e)  
  42.             {  
  43.                 Console.WriteLine("argumentNullException: {0}", e);  
  44.             }  
  45.             catch (SocketException e)  
  46.             {  
  47.                 Console.WriteLine("SocketException:{0}", e);  
  48.             }  
  49.             Console.WriteLine("Press Enter to Exit");  
  50.             Console.ReadLine();  
  51.         }  
  52.     }  
  53. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int port = 2000;
                string host = "127.0.0.1";
                ///建立終結點EndPoint
                IPAddress ip = IPAddress.Parse(host);
                //IPAddress ipp = new IPAddress("127.0.0.1");
                IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和埠轉化為IPEndpoint例項

                ///建立socket並連線到伺服器
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立Socket
                Console.WriteLine("Conneting…");
                c.Connect(ipe);//連線到伺服器

                ///向伺服器傳送資訊
                string sendStr = "hello!This is a socket test";
                byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字串編碼為位元組
                Console.WriteLine("Send Message");
                c.Send(bs, bs.Length, 0);//傳送資訊

                ///接受從伺服器返回的資訊
                string recvStr = "";
                byte[] recvBytes = new byte[1024];
                int bytes;
                bytes = c.Receive(recvBytes, recvBytes.Length, 0);//從伺服器端接受返回資訊
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine("client get message:{0}", recvStr);//顯示伺服器返回資訊
                ///一定記著用完socket後要關閉
                c.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("argumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException:{0}", e);
            }
            Console.WriteLine("Press Enter to Exit");
            Console.ReadLine();
        }
    }
}

Client端結果:


針對Socket程式設計,在使用之前,你需要首先建立Socket物件的例項,這可以通過Socket類的構造方法來實現:
public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
  
其中,addressFamily 引數指定 Socket 使用的定址方案,socketType 引數指定 Socket 的型別,protocolType 引數指定 Socket 使用的協議。
  
下面的示例語句建立一個 Socket,它可用於在基於 TCP/IP 的網路(如 Internet)上通訊。
  
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  
  
若要使用 UDP 而不是 TCP,需要更改協議型別,如下面的示例所示:
  
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  
  
一旦建立 Socket,在客戶端,你將可以通過Connect方法連線到指定的伺服器,並通過Send/SendTo方法向遠端伺服器傳送資料,而後可以通過Receive/ReceiveFrom從服務端接收資料;而在伺服器端,你需要使用Bind方法繫結所指定的介面使Socket與一個本地終結點相聯,並通過Listen方法偵聽該介面上的請求,當偵聽到使用者端的連線時,呼叫Accept完成連線的操作,建立新的Socket以處理傳入的連線請求。使用完 Socket 後,記住使用 Shutdown 方法禁用 Socket,並使用 Close 方法關閉 Socket。其間用到的方法/函式有:
  
   Socket.Connect方法:建立到遠端裝置的連線
   public void Connect(EndPoint remoteEP)(有過載方法)
   Socket.Send 方法:從資料中的指示位置開始將資料傳送到連線的 Socket。
   public int Send(byte[], int, SocketFlags);(有過載方法)
   Socket.SendTo 方法 將資料傳送到特定終結點。
   public int SendTo(byte[], EndPoint);(有過載方法)
   Socket.Receive方法:將資料從連線的 Socket 接收到接收緩衝區的特定位置。
   public int Receive(byte[],int,SocketFlags);
   Socket.ReceiveFrom方法:接收資料緩衝區中特定位置的資料並存儲終結點。
   public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);
   Socket.Bind 方法:使 Socket 與一個本地終結點相關聯:
   public void Bind( EndPoint localEP );
   Socket.Listen方法:將 Socket 置於偵聽狀態。
   public void Listen( int backlog );
   Socket.Accept方法:建立新的 Socket 以處理傳入的連線請求。
   public Socket Accept();
   Socket.Shutdown方法:禁用某 Socket 上的傳送和接收
   public void Shutdown( SocketShutdown how );
   Socket.Close方法:強制 Socket 連線關閉
   public void Close();
  
  
   可以看出,以上許多方法包含EndPoint型別的引數,在Internet中,TCP/IP 使用一個網路地址和一個服務埠號來唯一標識裝置。網路地址標識網路上的特定裝置;埠號標識要連線到的該裝置上的特定服務。網路地址和服務埠的組合稱為終結點,在 .NET 框架中正是由 EndPoint 類表示這個終結點,它提供表示網路資源或服務的抽象,用以標誌網路地址等資訊。.Net同時也為每個受支援的地址族定義了 EndPoint 的子代;對於 IP 地址族,該類為 IPEndPoint。IPEndPoint 類包含應用程式連線到主機上的服務所需的主機和埠資訊,通過組合服務的主機IP地址和埠號,IPEndPoint 類形成到服務的連線點。
  
   用到IPEndPoint類的時候就不可避免地涉及到計算機IP地址,.Net中有兩種類可以得到IP地址例項:
  
   IPAddress類:IPAddress 類包含計算機在 IP 網路上的地址。其Parse方法可將 IP 地址字串轉換為 IPAddress 例項。下面的語句建立一個 IPAddress 例項:
  
   IPAddress myIP = IPAddress.Parse("192.168.1.2");
  
  
   Dns 類:向使用 TCP/IP Internet 服務的應用程式提供域名服務。其Resolve 方法查詢 DNS 伺服器以將使用者友好的域名(如"host.contoso.com")對映到數字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一個 IPHostEnty 例項,該例項包含所請求名稱的地址和別名的列表。大多數情況下,可以使用 AddressList 陣列中返回的第一個地址。下面的程式碼獲取一個 IPAddress 例項,該例項包含伺服器 host.contoso.com 的 IP 地址。
  
   IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
   IPAddress ipAddress = ipHostInfo.AddressList[0];
  
  
   你也可以使用GetHostName方法得到IPHostEntry例項:
  
   IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")

相關推薦

C# Socket程式設計簡單Socket通訊功能

 示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊;這裡只是一個簡單的示例,是一個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。 下面是示例程式的簡單步驟說明 伺服器端:

C#套接字Socket程式設計簡單通訊

從網上看到的,自己手打學習過程 最簡單的套接字程式設計、實現伺服器從客戶端接受一條訊息並返回一條訊息。 基本過程: 1.根據伺服器IP和埠號建立EndPoint物件 2.建立Socket物件 3.利用

windows環境下的socket程式設計tcp檔案傳輸的實現

開發環境 使用codeclock軟體進行程式設計 新建專案選擇console application完成相應的步驟即可。在專案下有main.c的檔案只需要將程式碼寫入其中即可。 程式碼設計 客戶端 client #include <std

eclipse下的tomcat配置https簡單得配置https

如果 希望 alias lib connector connect eclipse cnblogs itl 近期公司列出一大堆的東西,其中包括https,啥也不想說,你們是無法理解的苦逼的我的 關於https這些通道可以去百度Google其原理,不廢話,自動生成秘鑰,需要使

驗證碼識別簡單之印刷體數字

轉化 end double show ray app def 藍色 代碼實現 # -*- coding: utf-8 -*- import numpy from PIL import Image image = Image.open("5.gif") heigh

乾貨: 如何安裝這 4 個能提升你學習和工作效率的 vim 外掛?簡單的一篇

讀這篇部落格你能學到些什麼? 這篇部落格主要介紹 vim 常用外掛的安裝配置方法,你可以學到下面這些內容: 掌握 vim 安裝外掛的方法,即使系統不同,也能有把握安裝成功 掌握常用 vim 外掛的配置和使用方法 通過本篇部落格學會類比,掌握解決問題的有效方

Java的異常Exception----簡單明瞭的總結

1、什麼是異常?       程式開發和執行過程中會出現編譯錯誤和執行錯誤。編譯錯誤容易被發現並排除,而執行錯誤(邏輯錯誤和異常)很難預料。因此為了程式的穩定性和可靠性,就需要對程式異常處理和保護。

footer固定在網頁底部且居中,超過一屏自動撐開簡單的CSS實現

html {height: 100%; } body {margin: 0;padding: 0;min-height: 100%;position: relative; } #footer{position: absolute;left: 0;right: 0;botto

swift 真正移除下面的tabbar簡單的解決方式

在使用push方式進行跳轉的時候,tabbar跟著顯示。有時候不需要它了,應該如何去掉呢 網上有很多種解決方案,原理大致相同(但是大部分方案只是做到了隱藏,隱藏後下面還是會有空白佔據一定的空間)如何把下面的空白也去掉呢?其實只需要三句程式碼或許兩句也能 方案一:(如果不行請

socket程式設計簡單c/s模式

      最簡單的C/S模式是經典的入門模式,也是大多數教材講解最多的,總的來說分為下面的幾個步驟 左邊為 客戶端模式,右邊為伺服器模式 伺服器模式相對複雜一點,這一點是肯定的,因為伺服器面對很多不同的客戶端的連線。 相關函式不解釋,入門級別的書本上都有,而且講解的非常

簡單的TCP協議 socket程式設計C語言伺服器和客戶端

         最近由於本人對網路程式設計的喜愛,所以對一點關於TCP協議socket程式設計的總結。由於本人的能力有限,寫的可能過於簡單,只適合初學者,歡迎大牛提出寶貴的意見,本人會感激不盡的。廢話少說了,進入正題。(下面程式碼是基於VC6.0)          下圖

Linux socket編程示例簡單的TCP和UDP兩個例子

步驟 proto 詳解 dto 應該 pro sock bind ram 一、socket編程    網絡功能是Uinux/Linux的一個重要特點,有著悠久的歷史,因此有一個非常固定的編程套路。   基於TCP的網絡編程:     基於連接, 在交互過程中, 服務器

**c++基於tcp協議的socket程式設計實現一個簡單伺服器**

c++基於tcp協議的socket程式設計實現一個簡單伺服器 基於tcp的通訊,可以利益socket套接字實現。通訊,顧名思義需要伺服器和客戶端兩者進行資訊互動。 通過流程圖我們可以看到程式設計實現伺服器和客戶端的步驟大致相同,而伺服器則更為複雜一些。本文之給出了一個簡單的伺服器程式設計和

Python基於socket程式設計UDP聊天

説明:多臺電腦連同一網路可通訊。 有介面版待更; 目錄 一、UDP聊天(無介面) 1. 架構 2. 程式碼 3. 測試 二、UDP聊天(可視介面)

Python基於socket程式設計TCP聊天 含配置

目錄 一、eclipse配置pyDev 1. 安裝 2.eclipse+pydev配置 3. eclipse配置 二、Tcp聊天(不可視)

Java Socket程式設計 簡單的WEB伺服器

簡單的WEB伺服器一個簡單的WEB伺服器將由列表9.2這樣構建.當然,還必須要對方法和迴應事件進行改進.簡單的伺服器不會分析和儲存請求頭.新的WEB伺服器將分析和儲存請求,為以後的處理作準備.為了達到這個目的,你必須有一個包含HTTP請求的類.HTTPrequest類列表9.5列出了一個完整的HTTPrequ

java網路程式設計:12、基於UDP的socket程式設計程式碼通訊-簡單例項

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、基於UDP伺服器端程式的編寫 二、基於UDP客戶端程式的編寫 三、系列文章(java網路程式設計) 通過上篇文章瞭解了基於UDP通訊的理論、基本步驟以及它跟TCP的區別

java網路程式設計:8、基於TCP的socket程式設計簡單socket通訊_一個客戶端

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、基於tcp的程式設計,就好像用電話進行交談一樣 二、在java中用於程式設計網路程式的類 三、套接字 + (輸出、輸入流) 1、伺服器程式編寫基本步驟: 2、客戶端程式

c++多執行緒模式下的socket程式設計執行緒池實現

     socket 程式設計可以說是一個基本的技術掌握,而多個客戶端向服務端傳送請求又是一個非常常見的場景,因此多執行緒模式下的socket程式設計則顯得尤為常見與重要。     本文主要利用執行緒池的技術,來實現多執行緒的模式,執行緒池的優點就不多述了,相信大家都能理

C++ Socket程式設計 概述

學習Socket程式設計時,整理的知識點。 套接字的概念及分類 在網路中,要全域性的標識一個參與通訊的程序,需要三元組:協議,IP地址以及埠號。要描述兩個應用程序之間的端到端的通訊關聯需要五元組:協議,信源主機IP,信源應用程序埠,信宿主機IP,信宿應用