首页 > 代码库 > c#学习之Socket网络编程

c#学习之Socket网络编程

我是新手以前没写过博客 希望大家勿喷,

在编写Socket的时候需要导入System.Net.Socket 命名空间。利用该类我们可以直接编写Socket的客户端和服务的的程序了,

这里我们只讲tpc协议下的Socket编程。

TCP Socket连接的过程可以简单的分为:①.服务端监听 ②.客户端请求 ③.建立连接,

在服务端:

(1)声明一个套接字(称为监听套接字)Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)声明一个端点(EndPoint)上面提到过Socket需要跟它绑定才能通信。IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 8080);

(3)设置监听队列serverSocket.Listen(100);

(4)通过Accept()方法来获取一个通信套接字(当有客户端连接时),这个方法会阻塞线程,避免界面卡死的现象,启动一个线程,把这个Accept()放在线程函数里面。

在客户端:

(1)声明一个套接字,通过connect()向服务器发起连接。

(2)通过Receive方法获取服务器发来的消息(这里同样启用一个线程,通过while循环来实时监听服务器端发送的消息)

注意:数据是以字节流(Byte[])的形式传递的,我会使用Encoding.UTF8.GetString()方法来获取为字符串。都是通过Send()来向彼此发送消息。

下面我们通过直接使用Socket类来构建一个简单的Socket应用程序,直接上代码吧 这是服务端代码。。

技术分享

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication1{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {                      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            IPAddress ip = IPAddress.Any;            IPEndPoint duan = new IPEndPoint(ip, 55555);                       s.Bind(duan);            textBox3.Text = "监听成功\n";            //设置在同一时间点内连接的数量            s.Listen(10);            //等待用户连接              Thread t = new Thread(A);            t.IsBackground = true;            t.Start(s);        }        Socket socketsend;        Dictionary<string, Socket> dic = new Dictionary<string, Socket>();        void A(object o)        {            while (true)            {                Socket s = o as Socket;                socketsend = s.Accept();                string name = socketsend.RemoteEndPoint.ToString();                dic.Add(name, socketsend);                comboBox1.Items.Add(name);                textBox3.AppendText("连接成功\n" + name + "\n");                Thread tt = new Thread(b);                tt.Start(socketsend);            }        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }        public void b(object oo)        {            Socket socketsend = oo as Socket;            while (true)            {                byte[] b = new byte[1024 * 1024 * 2];                int a = socketsend.Receive(b);                               if (a == 0)                {                    break;                }                string receive = Encoding.Default.GetString(b, 0, a);                textBox3.AppendText(receive + "\n");            }        }        private void button2_Click(object sender, EventArgs e)        {            byte[] by=  System.Text.Encoding.Default.GetBytes(textBox4.Text);            List<byte> b = new List<byte>();            b.Add(0);            b.AddRange(by);             byte []cc= b.ToArray();            dic[comboBox1.SelectedItem.ToString()].Send(cc);            //socketsend.Send(by);        }        private void button3_Click(object sender, EventArgs e)        {            OpenFileDialog dialog = new OpenFileDialog();            dialog.Title = "请选择文件";            dialog.InitialDirectory = @"C:\Users\PC\Desktop";            dialog.Filter = "所有文件|*.*";            dialog.ShowDialog();            string name=  dialog.FileName;            textBox5.Text = name;                  }        private void button5_Click(object sender, EventArgs e)        {            using (FileStream f = new FileStream(textBox5.Text, FileMode.Open, FileAccess.Read))            {                byte[] b = new byte[1024 * 1024 * 5];                int r = f.Read(b, 0, b.Length);                List<byte> list = new List<byte>();                list.Add(1);                list.AddRange(b);                byte[] newby = list.ToArray();                dic[comboBox1.SelectedItem.ToString()].Send(newby, 0, r + 1, SocketFlags.None);            }        }        private void button4_Click(object sender, EventArgs e)        {            byte[] a = new byte[1];            a[0] = 2;            dic[comboBox1.SelectedItem.ToString()].Send(a);        }    }}

技术分享

下面是客户端代码。。

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Threading;using System.IO;namespace WindowsFormsC{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        Socket ss;        private void button1_Click(object sender, EventArgs e)        {                      ss = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            IPAddress ip = IPAddress.Parse(textBox1.Text);            IPEndPoint duan = new IPEndPoint(ip, Convert.ToInt32( textBox2.Text));             ss.Connect(duan);             a("连接服务端成功");             Thread t = new Thread(b);             t.Start();                               }        void b()         {            while (true)            {                byte[] cc = new byte[1024 * 1024 * 2];                int ac = ss.Receive(cc);                if (ac == 0)                {                    break;                }                if (cc[0]==0)                {                    a(Encoding.Default.GetString(cc,1, ac-1));                                                 //0 a length                }                else if (cc[0]==1)                {                    SaveFileDialog dia = new SaveFileDialog();                    dia.Title = "请保存文件";                    dia.InitialDirectory = @"C:\Users\PC\Desktop";                    dia.Filter = "所有文件|*.*";                    dia.ShowDialog(this);                                        using (FileStream s=new FileStream (dia.FileName,FileMode.OpenOrCreate,FileAccess.Write))                    {                        s.Write(cc,0,ac-1);                        MessageBox.Show("保存成功","提示");                    }                }                else if (cc[0]==2)                {                    for (int i = 0; i < 1000; i++)                    {                        this.Location = new Point(200, 200);                        this.Location = new Point(250, 250);                                           }                                    }                            }                   }        void a(string name)         {            textBox3.AppendText(name + "\t\n");        }        private void button2_Click(object sender, EventArgs e)        {            byte[] v = Encoding.Default.GetBytes(textBox4.Text);            ss.Send(v);        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }    }}

技术分享

小程序的功能可以发消息,震动,传输文件、、。。。

大家可以加 编程学习交流 qq群 68363936~!!!

c#学习之Socket网络编程