C#網路程式設計-簡單的通訊原始碼

fourierr發表於2017-07-08
Form1.cs
***********************************************************
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;


namespace Sensor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


        }
        NetClient net;


        private void Form1_Load(object sender, EventArgs e)
        {
            net = new NetClient();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            net.ConnectToHost("172.20.130.48",3000);
        }


        private void button2_Click(object sender, EventArgs e)
        {
            net.WriteData("client send hello to server");
        }
    }
}
NetClient.cs
***********************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Sensor
{
    class NetClient
    {
        //網路的客戶端連線
        public NetClient()
        {
            //建構函式
        }
        Socket client;
        string ip;
        int port;
        byte[] buff = new byte[1024];
       public  void ConnectToHost(string ip,int port)
        {
           //這個可以直接用來連線公網IP
            this.ip = ip;
            this.port = port;
            Socket cli = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            cli.BeginConnect(ip, port, new AsyncCallback(Connected), cli);   //開始連線(非同步的)
        }
       private void Connected(IAsyncResult ias)
        {
            //回撥函式:IAsyncResult ias表示回撥
            client = (Socket)ias.AsyncState;
            if (client.Connected)
            {
                Console.WriteLine("連線成功!!!");
                //label1.Text = String.Format("連線成功!!!");
                client.BeginReceive(buff,0,buff.Length,0,new AsyncCallback(ReadyRead),client);    //開始接受資料到buff緩衝區,用ReadyRead返回
            }
            else
            {
                Console.WriteLine("連線失敗!!!");
            }
        }
        private void ReadyRead(IAsyncResult ias)
        {
            //非同步的讀
            Socket cli = (Socket)ias.AsyncState;
            int length = cli.EndReceive(ias);//讀完
            if (length > 0)
            {
                //>0則對資料處理
                byte[] tmp = new byte[length];
                Array.Copy(buff, tmp, length);//拷貝到buff
                Console.WriteLine(Encoding.Default.GetString(tmp));
                cli.BeginReceive(buff, 0, buff.Length, 0, new AsyncCallback(ReadyRead), client);
            }
            else
            {
                Console.WriteLine("長度<0 ->網路斷開");


            }
        }
        public void WriteData(string data)
        {
            //非同步傳送資料
            byte[] value = Encoding.Default.GetBytes(data);
            this.client.BeginSend(value,0,value.Length,0, new AsyncCallback(ReadyWrite), client);
        }
        private void ReadyWrite(IAsyncResult ias)
        {
            Socket cli = (Socket)ias.AsyncState;
            int len = cli.EndSend(ias);
        }
    }
}

相關文章