SOCKET

Socket相当于手机,代表通讯方式,客户端要连接服务器端,那么要拨打电话,那么这个IP地址以及每个应用程序的端口号构成了电话号码,服务器端至少两个Socket,一个负责监听是否有人打电话进来,另一个是当监听到有人打进来的时候,创建的一个新的通讯给他们连接,其实就是总座机跟分机的区别

SOCKET网络编程_客户端SOCKET网络编程_客户端_02
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;
        }
    }
}
View Code

SOCKET网络编程_端口号_03

 

 

 

 

 

一般应用模式(服务器端和客户端)

服务器端的Socket(至少需要两个)

1)一个负责接收客户端的连接请求(但不负责与客户端通信)

2)每成功连接到一个客户端的连接,便在服务端产生一个对应的负责通信的Socket

在接收到客户端连接时创建

为每个连接成功的客户端请求在服务器端都创建一个对应的Socket(负责和客户端通信)

 

客户端的Socket

客户端的Socket

1)必须指定要连接的服务器端地址和端口

2)通过创建一个Socket对象来初始化一个到服务器端的TCP连接

 

 

一般我们使用的Socket有两种类型

流式Socket(STREAM):是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全但是效率低;

数据报式Socket(DATARAM):是一种无连接的Socket,对应于无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但是效率高。