目前分類:程式語言 (190)

瀏覽方式: 標題列表 簡短摘要
C# 中的委派 (Delegation)

委派

using System;
// Declare delegate -- defines required signature:
delegate void SampleDelegate(string message);
class MainClass
{
    // Regular method that matches signature:
    static void SampleDelegateMethod(string message)
    {
        Console.WriteLine(message);
    }
    static void Main()
    {
        // Instantiate delegate with named method:
        SampleDelegate d1 = SampleDelegateMethod;
        // Instantiate delegate with anonymous method:
        SampleDelegate d2 = delegate(string message)
        {
            Console.WriteLine(message);
        };
        // Invoke delegate d1:
        d1("Hello");
        // Invoke delegate d2:
        d2(" World");
    }
}
        

事件

C#物件 事件 委派 撰寫 範例
using System;
using System.Collections.Generic;
using System.Text;
namespace eventSimple
{
    class Program
    {
        delegate void myFunction(string text);
        static event myFunction readKeyEvent;
        static void Main(string[] args)
        {
            readKeyEvent += new myFunction(myFunction1);
            Console.WriteLine("請輸入一字串");
            string text = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("第一次觸發事件");
            readKeyEvent.Invoke(text);
            Console.WriteLine();
            readKeyEvent += new myFunction(myFunction2);
            Console.WriteLine("請輸入一字串");
            text = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("第二次觸發事件");
            readKeyEvent.Invoke(text);
            Console.WriteLine();
            Console.WriteLine("按任意鍵離開");
            Console.ReadKey();
        }
        static void myFunction1(string text)
        {
            Console.WriteLine("這次第一次執行的函數");
            Console.WriteLine("參數="+text);
        }
        static void myFunction2(string text)
        {
            Console.WriteLine("這次第二次執行的函數");
            Console.WriteLine("參數=" + text);
        }
      }
}
        
文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

C# 與雲端運算

微軟的雲端運算平台稱為 Windows Azure,您可以用 C# 撰寫 Windows Azure 的程式,然後透過 Visual Studio 整合開發,這些程式會放在微軟的網站上,進行雲端式的服務,這就是微軟雲端運算的服務模式。

參考文獻

  1. Windows Azure 平台開發人員中心
  2. Windows Azure 雲端運算
  3. Windows Azure Platform 概述(中文PDF)
  4. 雲端運算:第二章:深入雲端- Windows Azure 平台- TechNet Taiwan

陳鍾誠 (2010年07月06日),(網頁標題) C# 與雲端運算,(網站標題) 免費電子書:C# 程式設計,2010年07月06日,取自 http://cs0.wikidot.com/cloud ,網頁修改第 3 版。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

C# 資料庫程式設計簡介
  1. 影片:C#.Net - Loading XML into DataGridView
  2. C# 資料庫起點

微軟 ADO.net 的資料庫處理方是主要分為三種,第一種是使用 DataReader,第二種使用 Stored Procedure,第三種使用 DataSet,其中以第三種最簡單方便。

使用 DataReader

  public void UseSqlReader()
  {
   SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);
   SqlCommand sqlCommand = new SqlCommand();
   sqlCommand.CommandType = System.Data.CommandType.Text;
   sqlCommand.Connection = sqlConnection;
   sqlCommand.CommandText = sqlSelectCommand;
   sqlConnection.Open();
   SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
   while(sqlDataReader.Read())
   {
    //Get KeywordID and KeywordName , You can do anything you like. Here I just output them.
    int keywordid = (int)sqlDataReader[0];
    //the same as: int keywordid = (int)sqlDataReader["KeywordID"]
    string keywordName = (string)sqlDataReader[1];
    //the same as: string keywordName = (int)sqlDataReader["KeywordName"]
    Console.WriteLine("KeywordID = " + keywordid + " , KeywordName = " + keywordName);
   }
   sqlDataReader.Close();
   sqlCommand.Dispose();
   sqlConnection.Close();
  }
        
文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

C# 與手機程式

電腦從大型、中型到小型的 PC 時代,不斷縮小, 接下來將是以 PDA 與手機為主的時代,程式設計人員有必要學習 PDA 與手機的程式設計方式,以迎接新時代的到來。

在 Visual Studio 當中用 C# 開發手機程式,可以說比寫視窗程式更簡單,因為 Visual Studio 支援手機模擬器,而且可以直接用視覺化的方式撰寫手機的視窗程式,這讓手機程式的撰寫變得非常的容易。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

C#遊戲程式設計

檔案下載:遊戲程式設計簡介 (ppt)
檔案下載:XNA 簡介 (ppt)

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

利用MS FaceBook SDK開發WinForm FaceBook應用程式(二) 

前面提到,透過FaceBook來開發應用程式需要進行申請以及下載需要的SDK。[先前的文章]

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

Facebook SDK

Johnson峰 發表在 痞客邦 留言(0) 人氣()

撰寫 Gmail 寄信程式
using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;
/// <summary>
/// myMail 的摘要描述
/// </summary>
public class myMail
{
    public myMail()
    {
        //
        // TODO: 在此加入建構函式的程式碼
        //
    }
    public static void SendMail(string sHost, int nPort, string sUserName, string sPassword, string sFromName, string sFromEmail,
     string sToName, string sToEmail, string sHeader, string sMessage, bool fSSL)
    {
        MailMessage em = new MailMessage(new System.Net.Mail.MailAddress(sFromEmail, sFromName, Encoding.UTF8),new System.Net.Mail.MailAddress(sToEmail,sToName, Encoding.UTF8));
        em.SubjectEncoding = System.Text.Encoding.UTF8;
        em.BodyEncoding = Encoding.UTF8;
        //信件主題 
        em.Subject = sHeader;
        //內容 
        em.Body =sMessage;
        em.IsBodyHtml = true;
        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
        //登入帳號認證  
        client.Credentials = new System.Net.NetworkCredential(sUserName,sPassword);
        //使用587 Port 
        client.Port = nPort;
        client.Host = sHost;
        //啟動SSL 
        client.EnableSsl = fSSL;
        //寄出 
        client.Send(em);
        /*
        if (sToName.Length == 0)
            sToName = sToEmail;
        if (sFromName.Length == 0)
            sFromName = sFromEmail;
        System.Web.Mail.MailMessage Mail = new System.Web.Mail.MailMessage();
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"] = sHost;
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = nPort.ToString();
        if (fSSL)
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"] = "true";
        if (sUserName.Length == 0)
        {
            //Ingen auth 
        }
        else
        {
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = sUserName;
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = sPassword;
        }
        Mail.To = sToEmail;
        Mail.From = sFromEmail;
        Mail.Subject = sHeader;
        Mail.Body = sMessage;
        Mail.BodyFormat = System.Web.Mail.MailFormat.Html;
        System.Web.Mail.SmtpMail.Send(Mail);
        */
    }
    public static void SendMail(string sHost, int nPort, string sUserName, string sPassword, string sFromName, string sFromEmail,
 string sToName, string sToEmail, string sHeader, string sMessage, bool fSSL, string sFile)
    {
        MailMessage em = new MailMessage(new System.Net.Mail.MailAddress(sFromEmail, sFromName, Encoding.UTF8), new System.Net.Mail.MailAddress(sToEmail, sToName, Encoding.UTF8));
        em.SubjectEncoding = System.Text.Encoding.UTF8;
        em.BodyEncoding = Encoding.UTF8;
        //信件主題 
        em.Subject = sHeader;
        //內容 
        em.Body = sMessage;
        em.IsBodyHtml = true;
        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
        //登入帳號認證  
        client.Credentials = new System.Net.NetworkCredential(sUserName, sPassword);
        //使用587 Port 
        client.Port = nPort;
        client.Host = sHost;
        //啟動SSL 
        client.EnableSsl = fSSL;
        Attachment data = new Attachment(sFile, MediaTypeNames.Application.Octet);
        // Add time stamp information for the file.
        ContentDisposition disposition = data.ContentDisposition;
        disposition.CreationDate = System.IO.File.GetCreationTime(sFile);
        disposition.ModificationDate = System.IO.File.GetLastWriteTime(sFile);
        disposition.ReadDate = System.IO.File.GetLastAccessTime(sFile);
        // Add the file attachment to this e-mail message.
        em.Attachments.Add(data);
        //寄出 
        client.Send(em);
        /*
        if (sToName.Length == 0)
            sToName = sToEmail;
        if (sFromName.Length == 0)
            sFromName = sFromEmail;
        System.Web.Mail.MailMessage Mail = new System.Web.Mail.MailMessage();
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"] = sHost;
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
        Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = nPort.ToString();
        if (fSSL)
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"] = "true";
        if (sUserName.Length == 0)
        {
            //Ingen auth 
        }
        else
        {
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = sUserName;
            Mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = sPassword;
        }
        Mail.To = sToEmail;
        Mail.From = sFromEmail;
        Mail.Subject = sHeader;
        Mail.Body = sMessage;
        Mail.BodyFormat = System.Web.Mail.MailFormat.Html;
        System.Web.Mail.SmtpMail.SmtpServer = sHost;
        System.Web.Mail.MailAttachment file = new System.Web.Mail.MailAttachment(sFile);
        Mail.Attachments.Add(file);
        System.Web.Mail.SmtpMail.Send(Mail);
        */
    }
}

陳鍾誠 (2010年06月15日),(網頁標題) 以 C# 撰寫 Gmail 寄信程式,(網站標題) 免費電子書:C# 程式設計,2010年06月15日,取自 http://cs0.wikidot.com/gmail ,網頁修改第 1 版。


文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

瀏覽器的控制 (Browser)

專案下載:2012 完整版 — WebBrowser2012.zip
專案下載:基本版 — Browser.zip

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

網路爬蟲 (Crawler) 的設計

簡介

原始程式

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
class WebCrawler
{
//    WebProxy proxy = new WebProxy("http://proxy.internal:3128/", true);
    List<String> urlList = new List<String>();
    // Dictionary<String, String> 
    public static void Main(String[] args)
    {
        WebCrawler crawler = new WebCrawler();
        crawler.urlList.Add("http://tw.msn.com/");
        crawler.craw();
    }
    public void craw()
    {
        int urlIdx = 0;
        while (urlIdx < urlList.Count)
        {
            try
            {
                String url = urlList[urlIdx];
                String fileName = "data/" + toFileName(url);
                Console.WriteLine(urlIdx + ":url=" + url + " file=" + fileName);
                urlToFile(url, fileName);
                String html = fileToText(fileName);
                foreach (String childUrl in matches("\\shref\\s*=\\s*\"(.*?)\"", html, 1))
                {
                    Console.WriteLine(childUrl);
                    urlList.Add(childUrl);
                }
            }
            catch
            {
                Console.WriteLine("Error:" + urlList[urlIdx] + " fail!");
            }
            urlIdx++;
        }
    }
    public static IEnumerable matches(String pPattern, String pText, int pGroupId)
    {
        Regex r = new Regex(pPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
        for (Match m = r.Match(pText); m.Success; m = m.NextMatch())
         yield return m.Groups[pGroupId].Value;
    }
    public static String fileToText(String filePath)
    {
        StreamReader file = new StreamReader(filePath);
        String text = file.ReadToEnd();
        file.Close();
        return text;
    }
    public void urlToFile(String url, String file)
    {
        WebClient webclient = new WebClient();
//        webclient.Proxy = proxy;
        webclient.DownloadFile(url, file);
    }
    public static String toFileName(String url)
    {
        String fileName = url.Replace('?', '_');
        fileName = fileName.Replace('/', '_');
        fileName = fileName.Replace('&', '_');
        fileName = fileName.Replace(':', '_');
        fileName = fileName.ToLower();
        if (!fileName.EndsWith(".htm") && !fileName.EndsWith(".html"))
         fileName = fileName + ".htm";
        return fileName;
    }
}
        

陳鍾誠 (2010年06月15日),(網頁標題) C# : 網路爬蟲 (Crawler) 的設計,(網站標題) 免費電子書:C# 程式設計,2010年06月15日,取自 http://cs0.wikidot.com/crawler ,網頁修改第 1 版。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

手工打造 HTTP Client

未測試成功

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
// HttpClient http://ccckmit.wikidot.com/ teach teach.htm
public class HttpClient
{
    public static void Main(string[] args)
    {
        // download("tw.msn.com", "/", "msn.htm");
        download("127.0.0.1", "/index.htm", "localindex.htm");
    }
    public static void download(String site, String path, String toFileName)
    {
/*        IPHostEntry hostEntry = Dns.GetHostEntry(site);
        foreach (IPAddress addr in hostEntry.AddressList)
        {
            Console.WriteLine("address = "+addr);
        }
        IPAddress ipAddress = hostEntry.AddressList[0];
//        IPEndPoint ipep = new IPEndPoint(ipAddress, 80);
 */
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(site), 80);
        //        IPEndPoint ipep = new IPEndPoint(ipAddress, 80);
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Connect(ipep);
        String head = "GET " + path + " HTTP/1.0\n\n";
        byte[] headbuf = Encoding.UTF8.GetBytes(head);
        server.Send(headbuf);
        NetworkStream stream = new NetworkStream(server);
        StreamReader reader = new StreamReader(stream);
        int contentLength = 0;
        while (true)
        {
            String line = reader.ReadLine();
            if (line.StartsWith("Content-Length:"))
                contentLength = int.Parse(line.Substring("Content-Length:".Length));
            Console.WriteLine(line);
            if (line.Length == 0) break;
        }
        byte[] buf = new byte[contentLength];
        reader.ReadBlock(buf, 0, contentLength);
        FileStream outFile = new FileStream(toFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
        outFile.Write(buf, 0, buf.Length);
        outFile.Close();
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }
}
        
文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

用程式下載一個網頁

下載單一網頁

using System;
using System.IO;
using System.Net;
class UrlDownloader
{
    public static void Main(String[] args)
    {
        Console.WriteLine(args[0]);
        UrlToFile(args[0], args[1]);
    }
    public static void UrlToFile(String url, String file)
    {
        WebClient webclient = new WebClient();
        webclient.DownloadFile(url, file);
    }
}
        

原始程式:下載很多網頁

using System;
using System.IO;
using System.Net;
class WebCrawler
{
    public static void Main(String[] args)
    {
        String text = fileToText(args[0]);
        String[] urls = text.Split('\n');
        for (int i = 0; i < urls.Length; i++)
        {
         Console.WriteLine(i + ":" + urls[i]);
         UrlToFile(urls[i], i+".htm");
        }
//     Console.WriteLine(text);
    }
    public static String fileToText(String filePath)
    {
        StreamReader file = new StreamReader(filePath);
        String text = file.ReadToEnd();
        file.Close();
        return text;
    }
    public static void UrlToFile(String url, String file) {
        WebClient webclient = new WebClient();
        webclient.DownloadFile("http://"+url, file);
    }
}
        
文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

實作 Web Server

下載:WebServer.zip

請注意:此範例必須在專案中加入 System.Web 套件引用。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

永遠傳回 Hello 的 WebServer

簡介

程式原始碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;
public class HttpServer
{
    public static void Main()
    {
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 80);
        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;
         // create a new thread and then receive message.
         HttpListener listener = new HttpListener(client);
         Thread thread = new Thread(new ThreadStart(listener.run));
         thread.Start();
        }
//      newsock.Close();
   }
}
public class HttpListener {
    Socket socket;
    public HttpListener(Socket s)
    {
        socket = s;
    }
    public void run() 
    {
        String msg = "Hello!";
        String helloMsg = @"HTTP/1.0 200 OK\nContent-Type: text/plain\nContgent-Length: "+msg.Length+"\n\n"+msg;
        NetworkStream stream = new NetworkStream(socket);
        StreamReader reader = new StreamReader(stream);
        String header = "";
        while (true) 
        {
         String line = reader.ReadLine();
         Console.WriteLine(line);
         if (line.Trim().Length==0)
         break;
         header += line+"\n";
        }
        socket.Send(Encoding.UTF8.GetBytes(helloMsg));
        socket.Close();
    }
}
        

陳鍾誠 (2010年06月15日),(網頁標題) C# : 永遠傳回 Hello 的 WebServer,(網站標題) 免費電子書:C# 程式設計,2010年06月15日,取自 http://cs0.wikidot.com/helloserver ,網頁修改第 0 版。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

UDP 的訊息傳遞程式

簡介

使用 UDP 方式傳送訊息,由於封包是以一個一個的方式分別傳輸,先傳送者不一定會先到,甚至於沒有到達也不進行處理。由於這種方式不是連線導向的方式,因此不需要記住連線的 Socket,只要直接用 Socket 當中的 ReceiveFrom(data, ref Remote) 函數即可。

程式範例

以下是一個 UDP 客戶端 UdpClient,該客戶端會接受使用者的輸入,然後將訊息傳遞給伺服端的 UdpServer。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

多人聊天室程式

專案程式下載:ChattingRoom.zip

// ---------------------------------------------------------------
// 共有五個程式檔案
//
//  程式檔 : ChatLib.cs
//  程式檔 : ChattServer.cs
//  程式檔 : WinChatClient.cs
//  程式檔 : FormChatClient.cs
//  程式檔 : FormChatClient.Designer.cs
//
// 編譯方式 : 
//    步驟 1 : csc ChatServer.cs ChatLib.cs
//             會產生 ChatServer.exe 檔
//
//    步驟 2 : csc WinChatClient.cs FormChatClient.cs FormChatClient.Designer.cs ChatLib.cs
//             會產生 WinChatClient.exe 檔
//     
// 執行方式 : 
//    步驟 1 : 執行 ChatServer.exe
//    步驟 2 : 執行 WinChatClient.exe (使用者 1)
//    步驟 3 : 執行 WinChatClient.exe (使用者 2)
//
// 如此,兩個 WinChatClient.exe 的視窗間即可透過本機聊天
// ---------------------------------------------------------------
        
文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

雙向P2P聊天程式 

簡介

聊天程式是學習網路程式設計很好的入門題目之一,在本文中,我們將示範如何用 C# 的 Socket 函式庫設計一個網路聊天程式。以下是這個程式的執行時的一個畫面,讀者可以看到我們在兩個命令列視窗中執行同一個 ChatBox 程式,左上角是 Server 程式,右下角是 Client 程式。

ChatBox.jpg

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

單向的訊息傳遞程式

簡介

程式範例

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

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

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

SharpPCap 封包攔截程式的設計 

簡介

在區域網路的設計上,為了節省線路成本,通常會使用廣播式的網路。像是目前最常用的乙太網路 (EtherNet) 就是一種廣播式區域網路。

在廣播式的網路當中,封包 (Packet) 一傳出去之後,所有的電腦都可以接收。只是作業系統通常會過濾掉不應接收的封包,只收下傳送給自己這台電腦的封包。但是,如果您真正想收下這些封包,也不是不可能,著名的網路封包監控軟體 Wireshark 就能收下這些封包並進行分析。而 Wireshark 所使用的接收元件,正是一個稱為 WinPCap 的程式。

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()

HTTP 網路程式設計簡介

簡介

HTTP 協定是 Web 的基礎,Web 是一個典型的 Client-Server 架構,主要由 HTTP+URL+HTML 所組成。

Web Server (網站伺服器) 是 WWW 網路的基礎, 1991 年 Tim Burner Lee 發明 HTML 與 URL 後,就自己寫了第一個

文章標籤

Johnson峰 發表在 痞客邦 留言(0) 人氣()