一般也称做"套接字",用于描述IP地址和端口,是一个通讯链的句柄。在Internet上的主机通常运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不一样的端口对应于不一样的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各类插座的房间,每一个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不一样编号的插座,就能够获得不一样的服务。编程
在TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接。 服务器
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; spa
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态 orm
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次blog
握手,客户端与服务器开始传送数据.string
服务端:it
1.监听客户请求,使用Socket用于监听io
2.根据客户请求为客户建立Socket,为每个客户建立新的Socketclass
服务端至少须要两个Socket,一个Socket负责监听客户请求,另外一个Socket用于处理客户请求thread
客户端:
1.向服务端发起请求,使用Socket用于请求服务端
服务端:
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"); } } }
客户端:
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); } } }