# 同步

//1.建立socket对象(用于监听)
//1.网络地址。2.数据传输格式,3通信协议
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.绑定ip和端口
IPAddress ip = IPAddress.Parse('192.168.168.108);
IPEndPoint iPEndPoint = new IPEndPoint(ip, 50505);
serverSocket.Bind(iPEndPoint);
//3.开始侦听
serverSocket.Listen(10);
//4.开始接受客户端链接(用于传输)
//Accept执行 ,阻塞当前主线程,一直到客户端链接上
Socket proxSocket = serverSocket.Accept();
string str = DateTime.Now.ToString();
byte[] data = Encoding.Default.GetBytes(str);
proxSocket.Send(data,0,data.Length,SocketFlags.None);
//5.关闭
proxSocket.Shutdown(SocketShutdown.Both);
proxSocket.Close();
//6.监听的关闭
serverSocket .Close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 异步改进

List<Socket> Clientsockets = new List<Socket>();
private void button1_Click(object sender, EventArgs e)
{
    //1.建立socket对象
    //1.网络地址。2.数据传输格式,3通信协议
    Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //2.绑定ip和端口
    IPAddress ip = IPAddress.Parse("192.168.168.108");
    IPEndPoint iPEndPoint = new IPEndPoint(ip,int.Parse("5050"));
    serverSocket.Bind(iPEndPoint);
    //3.开始侦听
    serverSocket.Listen(10);
    ThreadPool.QueueUserWorkItem(new WaitCallback(this.StaetAcceptClient),serverSocket);
}

public void StaetAcceptClient(object state)
{
    //4.开始接受客户端链接
    //Accept执行 ,阻塞当前主线程,一直到客户端链接上
    var serverSocket = (Socket)state;
    while (true)
    {
        Socket proxSocket = serverSocket.Accept();
        Clientsockets.Add(proxSocket);             
        ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReciveData), proxSocket);
    }
}

public void ReciveData(object obj)
{
    var proxSocket = (Socket)obj;
    byte[] data = new byte[1024 * 1024];
    while (true)
    {
        //代表实际上接收的返回数
        int reallen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
        if (reallen==0)
        {
            //退出了
            proxSocket.Shutdown(SocketShutdown.Both);
            proxSocket.Close();
            Clientsockets.Remove(proxSocket);
            return;
        }
        string fromClientMsg = Encoding.Default.GetString(data,0,reallen);
        proxSocket.RemoteEndPoint.ToString();
    }
}

private void button2_Click(object sender, EventArgs e)
{
    foreach (var socket in Clientsockets)
    {
        if (socket.Connected)
        {
            string str = "发送的消息";
            byte[] data = Encoding.Default.GetBytes(str);
            socket.Send(data,0,data.Length,SocketFlags.None);
        }
    }
}
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
59
60
61