2013年11月28日 星期四

[C#][TCP] TCP 傳接收Byte資料

string TcpConnect(string message, string hostNameOrAddress, string port)
        {
            Cursor.Current = Cursors.WaitCursor;
            Cursor.Show();

            bool IsNumber = true;
            foreach (char c in port)
            {
                IsNumber = Char.IsNumber(c);
                if (!IsNumber)
                    break;
            }

            if (!IsNumber)
            {
                Cursor.Current = Cursors.Default;
                Cursor.Hide();
                return "S";
            }
            //throw new ArgumentException("Port must be \"Number\"!!");

            Encoding encode = Encoding.ASCII;

            TcpClient client = new TcpClient(AddressFamily.InterNetwork);
            client.Client.Poll(2000, SelectMode.SelectError);
            client.Client.Poll(2000, SelectMode.SelectRead);
            client.Client.Poll(2000, SelectMode.SelectWrite);

            NetworkStream stream = null;

            ArrayList buffer = null;

            Char splitchar = '^';

            try
            {
                IPEndPoint point = new IPEndPoint(Dns.GetHostEntry(hostNameOrAddress).AddressList[0], int.Parse(port));

                client.Connect(point);
                stream = client.GetStream();

                string sentdata = String.Format("{1}{0}{2}", splitchar.ToString(), message.Length, message);
                buffer = new ArrayList(encode.GetBytes(sentdata));
                stream.WriteByte(1);
                stream.Write((byte[])buffer.ToArray(typeof(System.Byte)), 0, buffer.Count);
                stream.WriteByte(2);

                int iTimeOut = 2000;
                while (client.Client.Available == 0 && !stream.DataAvailable)
                {
                    if (iTimeOut == 0)
                        break;
                    Thread.Sleep(1);
                    iTimeOut--;
                }

                buffer.Clear();

                int i = stream.ReadByte();
                while (i > -1)
                {
                    if (i == 1)
                        buffer.Clear();
                    else if (i == 2)
                        break;
                    else
                        buffer.Add((byte)i);

                    i = stream.ReadByte();
                }
            }
            catch (SocketException)
            {
                if (errCount == 3)
                {
                    //SharedMethod.NextAddr = !SharedMethod.NextAddr;
                    errCount = 1;
                }
                else
                {
                    errCount++;
                }

                Cursor.Current = Cursors.Default;
                Cursor.Hide();
                return "S";
            }
            catch (Exception)
            {
                Cursor.Current = Cursors.Default;
                Cursor.Hide();
                return "G";
            }
            finally
            {
                if (stream != null)
                    stream.Close();
                if (client != null)
                    client.Close();
            }

            if (buffer != null && buffer.Count > 0)
            {
                byte[] rbyte = (byte[])buffer.ToArray(typeof(System.Byte));
                string result = encode.GetString(rbyte, 0, rbyte.Length);
                if (String.IsNullOrEmpty(result) || result.IndexOf(splitchar) < 0)
                {
                    Cursor.Current = Cursors.Default;
                    Cursor.Hide();
                    return "R";
                    //throw new InvalidOperationException("Receive data struct incurrect!!...");
                }
                else
                {
                    string slength = result.Substring(0, result.IndexOf(splitchar));
                    int datalength = 0;
                    try
                    {
                        datalength = int.Parse(slength);
                    }
                    catch
                    {
                        Cursor.Current = Cursors.Default;
                        Cursor.Hide();
                        return "R";
                        //throw new InvalidOperationException("LEN must be \"Number\"!!");
                    }

                    if (datalength == result.Length - slength.Length - 1)
                    {
                        Cursor.Current = Cursors.Default;
                        Cursor.Hide();
                        return result.Substring(slength.Length + 1);
                    }
                    else
                    {
                        Cursor.Current = Cursors.Default;
                        Cursor.Hide();
                        return "R";
                    }
                    //throw new InvalidOperationException("Data lost!!");
                }
            }
            else
            {
                Cursor.Current = Cursors.Default;
                Cursor.Hide();
                return "G";
            }
        }

2013年11月27日 星期三

[Java] public/private/protected

在說明這四個關鍵字之前,我想就class之間的關係做一個簡單的定義,對於繼承自己的class,base class可以認為他們都是自己的子女,而對於和自己一個目錄下的classes,認為都是自己的朋友。

1、public:public表明該數據成員、成員函數是對所有用戶開放,所有用戶都可以直接進行調用

2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有財產神聖不可侵犯嘛,即便是子女,朋友,都不可以使用。

3、protected:protected對於子女、朋友來說,就是public的,可以自由使用,沒有任何限制,而對於其他的外部class,protected就變成private。

作用域        當前類      同一package 子孫類       其他package

public     V    V      V    V

protected   V    V         V     X

friendly    V    V         X    X

private    V    X      X     X

不寫時默認為friendly

[C#] String.format 輸出格式

//數字字串不足,前面補0
Response.Write(String.Format("{0:00000}", 123)); // 輸出 00123
Response.Write(String.Format("{0:D5}", 123)); // 輸出 00123

//數字字串不足,前後都補0
Response.Write(String.Format("{0:00000.0000}", 123.45)); // 輸出 00125.4500

//每3位數加逗號
Response.Write(String.Format("{0:0,0}", 0)); // 輸出 00
Response.Write(String.Format("{0:0,0}", 1234567)); // 輸出 1,234,567  //缺點:當數字=0時,會顯示 00
Response.Write(String.Format("{0:N}", 1234567)); // 輸出 1,234,567.00
Response.Write(String.Format("{0:N0}", 1234567)); // 輸出 1,234,567
Response.Write(String.Format("{0:N4}", 1234567)); // 輸出 1,234,567.0000

//電話號碼
Response.Write(String.Format("{0:(###) ####-####}", 88012345678)); // 輸出(880)1234-5678

//金額表示方式
Response.Write(String.Format("{0:C}", 0)); // 輸出 NT$0.00
Response.Write(String.Format("{0:C}", 12345)); // 輸出 NT$12,345.00
Response.Write(String.Format("{0:$#,##0.00;($#,##0.00);Zero}", 0)); // 輸出 Zero
Response.Write(String.Format("{0:$#,##0.00;($#,##0.00);Zero}", 1234.50)); // 輸出 $1,234.50

//百分比
Response.Write(String.Format("{0:0%}", 17 / (float)60)); // 輸出 28%

//到小數2位的百分比
Response.Write(String.Format("{0:0.00%}", 17 / (float)60)); // 輸出 28.33%

//取小數第4位,並對第5位做四捨五入
Response.Write(String.Format("{0:#,0.####}", 1234.56789)); // 1,234.5679

//小數點不足4位不補0
Response.Write(String.Format("{0:0.####}", 1234.567)); // 1234.567

2013年11月26日 星期二

[.Net][C#] DateTime 格式

在cs裡面:

DateTime dt = DateTime.Now;

TextBox_Date.Text = dt.ToString("yyyy/MM/dd");  // 2013/11/27


在aspx裡面:

<%-- 假設資料表有欄位名稱Date並且是DateTime型態 --%>

<asp:Label ID="DateLabel" runat="server" Text='<%# Eval("Date","{0:yyyy/MM/dd}") %>' />

[SQL] INNER JOIN

SELECT 

B.UserName, A.Type

FROM 

資料表名稱1 AS A 

INNER JOIN 

資料表名稱2 AS B 

ON 

A.UserNo = B.UserNo;

利用兩個資料表皆有的欄位UserNo來連結。