首页 > 代码库 > Socket编程初探

Socket编程初探

一.什么是Socket?

      通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

二.三次握手   

     在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。       

     第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;           

     第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态      

     第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次

握手,客户端与服务器开始传送数据.

三.Socket编程思路

   服务端:

   1.监听客户请求,使用Socket用于监听

   2.根据客户请求为客户创建Socket,为每一个客户创建新的Socket

   服务端至少需要两个Socket,一个Socket负责监听客户请求,另一个Socket用于处理客户请求

   客户端:

   1.向服务端发起请求,使用Socket用于请求服务端     

四.实例

   服务端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace 套接字
{
    public partial class ServerFrm : Form
    {
        //负责监听端口
        Socket sokWelcome = null;
        Thread thdWatchPort = null;
        //负责与客户端通信
        Socket sokConnection = null;
 
        public ServerFrm()
        {
            InitializeComponent();
 
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void btnStartListen_Click(object sender, EventArgs e)
        {
            StartListen();
        }
 
        public void StartListen()
        {
            //获取IP地址
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            //获取IP节点
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //创建监听套接字(寻址协议,流方式,TCP协议)
            sokWelcome = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sokWelcome.Bind(endPoint);
            sokWelcome.Listen(10);
            ShowMessage("开始监听...");
            thdWatchPort = new Thread(WatchPort);
            thdWatchPort.Start();
        }
 
        public void WatchPort()
        {
            while (true)
            {
                sokConnection = sokWelcome.Accept();
                ShowMessage("监听到连接啦!!!");
            }   
        }
 
        public void ShowMessage(string message)
        {
            txtShowMessage.AppendText(message+"\r\n");
        }
    }
}

    客户端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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;
using System.Threading;
 
namespace 套接字客户
{
    public partial class ClientFrm : Form
    {
        Socket sokClient = null;
        Thread threadClient = null;
 
        public ClientFrm()
        {
            InitializeComponent();
        }
 
        private void btnConnect_Click(object sender, EventArgs e)
        {
            Connect();
        }
        
        private void Connect()
        {
            sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            sokClient.Connect(endPoint);
        }
    }
}