2012年5月6日 星期日

[C#] Socket (I)

Console_Client to Form_Server

Server


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;




namespace ServerSocker1

{

class Program

{

static void Main(string[] args)

{




int recv;

byte[] data = new byte[1024];

Console.Title = "Socket_Server 端";




//得到本機IP,设置TCP端口號

Start:

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001);//固定Port,用所有可用IP,定義一網路端點

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //定義一個Socket及網路類型,數據連接類型和網路協議 UDP



//綁定網路位址

newsock.Bind(ipep);

Console.WriteLine("This is a Server");

//等待Client端連接

Console.WriteLine("Waiting for a client");

//得到Client端 IP

IPEndPoint myclient = new IPEndPoint(IPAddress.Any, 0); //定義Client端的位址

EndPoint Remote = (EndPoint)(myclient); //Remote:IP&Port

recv = newsock.ReceiveFrom(data, ref Remote);//接收資料

Console.WriteLine("Message received from {0}: ", Remote.ToString());

Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));




//Client端連接成功後,發送歡迎訊息

string welcome = "You can enter a value ";



//字符串與字節數組相互轉換

data = Encoding.ASCII.GetBytes(welcome);



//發送訊息

newsock.SendTo(data, data.Length, SocketFlags.None, Remote);



while (true)//讀取數據

{

data = new byte[1024];

//發送接受信息

recv = newsock.ReceiveFrom(data, ref Remote);//接收資料

Console.WriteLine(Encoding.GetEncoding(950).GetString(data, 0, recv));//顯示所接收的資料

// newsock.SendTo(data, recv, SocketFlags.None, Remote);//發送所接收的資料回Client端




if (Encoding.GetEncoding(950).GetString(data, 0, recv) == "Socket is closed") //判斷client是否關閉Listen

{

Console.WriteLine();

newsock.Close(); goto Start;

}

else if (Encoding.GetEncoding(950).GetString(data, 0, recv) == "exit")

        {
            newsock.Close(); goto Start;
         }



    }




   }

  }

}





Client

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Client_Socket_GUI
{
    public partial class Form1 : Form
    {
        byte[] data = new byte[1024]; //用來做數據的緩衝區
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);//指定接收位址--server
        int recv=0;

        public Form1()
        {
            InitializeComponent();
          
          
        }
    

        private void Listen_button_Click(object sender, EventArgs e)
        {
            Listen_button.Enabled = false;
          
          
            //發送訊息
          

            IPEndPoint myclient = new IPEndPoint(IPAddress.Any, 0);//定義Client端的位址
            EndPoint Remote = (EndPoint)myclient;

            //定義一個Socket及網路類型,數據連接類型和網路協議 UDP
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            string message = "Connected Client Success! ";
            data = Encoding.ASCII.GetBytes(message);
            server.SendTo(data, data.Length, SocketFlags.None, ipep);//將訊息發送至Server端

            data = new byte[1024];
            recv = server.ReceiveFrom(data, ref Remote);//接受來自Server的訊息
            label1.Text = Encoding.ASCII.GetString(data, 0, recv);

            stop_button.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

          
        }

        private void input_textbox_TextChanged(object sender, EventArgs e)
        {

        }

        private void stop_button_Click(object sender, EventArgs e)
        {
          
            string exit = "Socket is closed";
            Listen_button.Enabled = true;
            stop_button.Enabled = false;
          
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定義一個Socket及網路類型,數據連接類型和網路協議 UDP
            server.SendTo(Encoding.GetEncoding(950).GetBytes(exit), ipep);//發送數據
            label1.Text = "";
            server.Close();
            recv = 0;
        }

        private void send_button_Click(object sender, EventArgs e)
        {
          
                if (recv!=0)
                {
                    Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定義一個Socket及網路類型,數據連接類型和網路協議 UDP
                    server.SendTo(Encoding.GetEncoding(950).GetBytes(input_textbox.Text), ipep);//發送數據
                }
          
                else
                {
                MessageBox.Show(this,"press the Listen button please.","Error");
                }
                input_textbox.Text="";
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
          
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void exit_button_Click(object sender, EventArgs e)
        {
            string exit="exit";
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定義一個Socket及網路類型,數據連接類型和網路協議 UDP
            server.SendTo(Encoding.GetEncoding(950).GetBytes(exit), ipep);//發送數據
            this.Close();
        }

    }
}






--------------------------------------------------------------------------------------------------------------------------




以上程式是小弟抓取網路上的範例程式(Console to Console)依照自己的想法來更改的
對於Socket程式還沒有很熟悉,還請各位多多指教 : )

沒有留言:

張貼留言