zoukankan      html  css  js  c++  java
  • 多线程和Socket网络编程(一)

    视频:https://www.bilibili.com/video/BV1FJ411v7hv?p=15

    进程:每一个应用程序都当做一个进程。

    using System;
        using System.Diagnostics;
        
        namespace ConsoleApp2
        {
            class Program
            {
                static void Main(string[] args)
                {
                    foreach (var item in Process.GetProcesses())
                    {
                        //关闭进程,可能先要获取权限
                        item.Kill();
                        Console.WriteLine(item);
                    }
        
                    // 打开程序
                    Process.Start("calc");
                    Process.Start("iexplore");
        
                    // 打开详细的文件
                    ProcessStartInfo startInfo = new ProcessStartInfo(@"C:UsersibiDesktop工作.xlsx");
                    Process process = new Process();
                    process.StartInfo = startInfo;
                    process.Start();
                }
            }    
        }
    View Code

    线程:其他子线程的创建可以有效避免UI主线程的卡死,线程分前台线程和后台线程,当所有前台线程已经关闭,后台线程自动关闭。跨线程访问UI主线程要注意UI主线程的销毁可能带来的异常。销毁掉的线程无法重启。

    using System;
        using System.Threading;
        using System.Windows.Forms;
        
        namespace WindowsFormsApp2
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }
        
                Thread thread;
        
                private void button1_Click(object sender, EventArgs e)
                {
                    // 创建一个子线程,传入方法。
                    thread = new Thread(() =>
                    {
                        for (int i = 0; i < 10000; i++)
                        {
                            Console.WriteLine(i);
                        }
                    });
                    // 1、设置线程为后台线程 2、标记线程就绪,何时执行由CPU决定。
                    thread.IsBackground = true;
                    thread.Start();
                }
        
                private void Form1_FormClosing(object sender, FormClosingEventArgs e)
                {
                    if (thread != null)
                    {
                        thread.Abort();
                    }
                }
        
                private void Form1_Load(object sender, EventArgs e)
                {
                    // 取消跨线程调用的检查
                    Control.CheckForIllegalCrossThreadCalls = false;
                }
            }
        }
    View Code

    线程方法传参:方法的参数类型必须为Object。

    Socket:程序与程序直接的一种通信机制,也称“套字节”。通过Socket需要知道程序对应的ip地址和端口。Socket涉及协议TCP或UDP,TCP三次握手、安全稳定、效率低,UDP容易发生数据丢失、效率高。

    服务端使用Socket步骤:1、Bind函数绑定监听端点,2、Listen函数设置监听队列(在某个时间内允许的最多连接数)3、Accept函数等待接收客户端的连接

    4、放进后台线程等待客户端的连接,每有一个新的连接,就创建一个新的Socket,使用“While(true){...等待客户端的连接...}”,5、使用Receive函数接收客户端发过来的消息,如果客户端下线了,接收到的消息为空即0字节。

     private void button1_Click(object sender, EventArgs e)
     {
         Socket socket = new Socket(SocketType.Stream,ProtocolType.Tcp);
         IPAddress ip = IPAddress.Any;
         IPEndPoint endPoint = new IPEndPoint(ip, 8083);
         socket.Bind(endPoint);
         MessageBox.Show("监听成功");
         socket.Listen(10);
         // 等待客户端的连接
         Socket socketSend = socket.Accept();
         MessageBox.Show(socketSend.RemoteEndPoint.ToString()+"连接成功");
    
         // 客户端连接成功后,服务器可以收到客户端发送过来的消息。
         byte[] buffer = new byte[1024 * 1024 * 2];
         int r = socketSend.Receive(buffer);
         // 获取客户端发过来的字符串
         string str = Encoding.UTF8.GetString(buffer, 0, r);
     }
    View Code

    客户端使用Socket步骤:1、Connect函数连接服务端,2、Send函数发送消息(服务端发送消息给客户端,也是使用客户端的Socket来Send字节),3、Receive函数接收服务端发送过来的消息

    Socket socket = new Socket(SocketType.Stream,ProtocolType.Tcp);
    IPAddress ip = IPAddress.Parse("192.169.11.87");
    IPEndPoint endPoint = new IPEndPoint(ip, 5000);
    socket.Connect(endPoint);
    
    string msg = "消息来了";
    byte[] buffer = Encoding.UTF8.GetBytes(msg);
    socket.Send(buffer);
    View Code

    Socket和多线程一起运用的聊天举例:

    在服务端中,服务端开启一个后台线程不停的新的客户端连接,每个客户端连接Socket都单独开启一个后台线程来接收客户端发送过来的消息。

    在客户端中,开启一个后台线程来接收服务器发送过来的消息。

  • 相关阅读:
    2016.7.31整机升级计划
    UVa 1588
    UVa1587
    Jzoj4714 公约数
    Jzoj4714 公约数
    Jzoj4713 A
    Jzoj4713 A
    Jzoj4711 Binary
    Jzoj4711 Binary
    Jzoj4710 Value
  • 原文地址:https://www.cnblogs.com/bibi-feiniaoyuan/p/socket_first.html
Copyright © 2011-2022 走看看