C# 單向的訊息傳遞程式

基礎篇

C# 簡介

開發環境

變數與運算

流程控制

陣列

函數

物件

例外處理

函式庫篇

檔案處理

資料結構

正規表達式

Thread

應用篇

視窗程式

媒體影音

網路程式

遊戲程式

手機程式

資料庫

雲端運算

特殊功能

委派

擴展方法

序列化

LinQ

WPF

網路資源

教學影片

投影片

教學文章

軟體下載

考題解答

101習題

簡介

程式範例

由於網路程式必須有連線,因此至少要有兩個程式才能運作,通常主動連線的一方稱為 Client,被動等待連線的一方稱為 Server,這就是所謂的 Client - Server 架構。

在本範例中,我們撰寫了一個 TcpClient 與一個 TcpServer 程式,TcpClient 連線到 TcpServer 之後,會將使用者所輸入的文字傳司送給 TcpServer。當 TcpServer 收到這些文字之後會印出在螢幕上,這個範例示範了一個極為簡單的網路程式架構。

檔案:TcpClient1.cs

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class TcpClient
{
    public static void Main(string[] args)
    {
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(args[0]), 20);

        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Connect(ipep);

        while(true)
        {
         string input = Console.ReadLine();
         if (input == "exit")
         break;
         byte[] data = Encoding.UTF8.GetBytes(input);
//     byte[] data = Encoding.ASCII.GetBytes(input);
         server.Send(data);
        }
        Console.WriteLine("Disconnecting from server...");
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }
}

檔案:TcpServer1.cs

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class TcpServer
{
    public static void Main()
    {
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 20);

        Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        newsock.Bind(ipep);
        newsock.Listen(10);

        while(true)
        {
         Socket client = newsock.Accept();
         IPEndPoint clientep = (IPEndPoint) client.RemoteEndPoint;
         Console.WriteLine("Client End Point = " + clientep);
         // create a new thread and then receive message.
         TcpListener listener = new TcpListener(client);
         Thread thread = new Thread(new ThreadStart(listener.run));
         thread.Start();
        }
//     newsock.Close();
    }
}

public class TcpListener {
    Socket socket;

    public TcpListener(Socket s)
    {
        socket = s;
    }

    public void run() 
    {
        try {
          while (true) 
          {
            byte[] data = new byte[1024];
            int recv = socket.Receive(data);
            if (recv == 0) break;
            Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));
          }
          socket.Close();
        } catch (Exception e) {
          Console.WriteLine("Client "+socket.RemoteEndPoint+" Error : close");
          Console.WriteLine(e);
        }
    }
}

上述程式的執行結果如下所示:

TcpClientServer1.jpg
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License