SOCKET网络编程
SOCKET
Socket相当于手机,代表通讯方式,客户端要连接服务器端,那么要拨打电话,那么这个IP地址以及每个应用程序的端口号构成了电话号码,服务器端至少两个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; namespace SOCKET网络编程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnWatch_Click(object sender, EventArgs e) { //创建一个负责监听的Socket Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建IP地址和端口号对象 IPAddress ip = IPAddress.Any;//这句Any是获取自己当前本机的IP, //IPAddress ip=IPAdress.Parse(txtIP.Text); 这句是获取textbox里面输入的地址 IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//这里是获取文本框里输入的端口号,创建了一个端口对象,需要传入ip跟端口号 //让负责监听的Socket绑定IP地址跟端口号 socketWatch.Bind(point); ShowMsg("监听成功"); //设置监听队列 socketWatch.Listen(10); Thread th = new Thread(listen); th.IsBackground = true; th.Start(socketWatch); } void listen(object o) { Socket socketWatch = o as Socket;//as的用法就是如果可以的话,那就直接转换过去 while (true) { //负责监听的Socket 来接收客户端的连接 创建跟客户端通信的Socket Socket socketSend = socketWatch.Accept(); //如果接收成功,把发送端的地址显示出来 ShowMsg(socketSend.RemoteEndPoint.ToString() + "连接成功"); } } void ShowMsg(string str) { txtShow.AppendText(str + "\r\n"); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } } }
一般应用模式(服务器端和客户端)
服务器端的Socket(至少需要两个)
1)一个负责接收客户端的连接请求(但不负责与客户端通信)
2)每成功连接到一个客户端的连接,便在服务端产生一个对应的负责通信的Socket
在接收到客户端连接时创建
为每个连接成功的客户端请求在服务器端都创建一个对应的Socket(负责和客户端通信)
客户端的Socket
客户端的Socket
1)必须指定要连接的服务器端地址和端口
2)通过创建一个Socket对象来初始化一个到服务器端的TCP连接
一般我们使用的Socket有两种类型
流式Socket(STREAM):是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全但是效率低;
数据报式Socket(DATARAM):是一种无连接的Socket,对应于无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但是效率高。