第一章发送邮件所需要学习的类

  • 需要引用的命名空间:System.Net.Mail
    此命名空间包含了将电子邮件发送到简单邮件的传输协议(SMTP)服务器进行传送的类。

  • 该命名空间中的类:
    1)MailMessage类:代表的是可以使用SmtpClient类发送的电子邮件,主要用于设置发送电子邮件时,收件人,发件人及邮件内容的一些相关信息。
    2)其中SmtpClient类允许应用程序使用简单邮件传输协议(SMTP)来发送电子邮件。
    3)总结来说MailMessages是用来设置邮件内容,而SmtpClient是用来实行邮件传输协议(SMTP)的方式

  • MailMessage类的常用属性:通俗易懂理解
    AlternateViews :正文的替代式附件集合
    Attachments :电子邮件的附件集合
    Bcc :密件抄送收件人的地址集合
    Body :邮件正文
    Body :Encoding 邮件正文编码
    CC :电子邮件的发送通知
    headers :电子邮件的标题
    IsBodyHtm :此邮件正文是否为HTML格式
    Priority :电子邮件的优先级
    ReplyTo:(已过时) 邮件的回复地址
    Sender :电子邮件发件人地址
    Subject :电子邮件的主题
    SubjectEncoding :电子邮件的主题编码
    To :电子邮件收件人的集合
    From :电子邮箱发件人地址

  • SmtpClient类常用的属性和方法
    SmtpClient构造发送电子邮件,必须指定以下内容:
    1、用来发送电子邮件的SMTP主机服务器
    2、身份验证凭据(如果SMTP服务器要求)
    3、发件人的电子邮件地址
    4、收件人的电子邮件地址
    5、邮件内容

    属性
    Credentials: 验证发件人身份的凭据
    DeliveryMethod: 如何处理待发的电子邮件(草稿箱)
    Enablessl: 使用安全套接字层(SSL)加密的连接
    Host: SMTP事务的主机名或者IP地址
    PickupDirectoryLocation: 设置一个文件夹,来保存将由本地SMTP:服务器处理的邮件
    Port :用于SMTP事务的端口
    ServicePoint: 传输电子邮件的网络连接
    Timeout: 指定的时间量,同时调用Send后发生超时状态。

    方法
    Send(string,string,string,string):发送电子邮件(SMTP服务器进行传递)参数(发送人,收件人,主题,正文)

    SendAsync():发送电子邮件。此方法不会阻止调用线程,Send()方法会阻止其他线程操作(如编写其他的电子邮件信息)

    SendAsyncCancel(): 取消异步操作发送电子邮件

    UseDefaultCredentials(): 是否发送邮件时,随请求(DefaultCredentials)凭据一起发送。

    上面是MailMessages和SmtpClient两个类中重要的属性和方法。

  • 实现邮箱信息传输的代码如下:

    /// <summary>/// 发送邮箱/// </summary>private void SendMail_Click(object sender, EventArgs e){try{SmtpClient smtp = new SmtpClient();smtp.Host = @"smtp.qq.com";//邮箱服务器smtp.EnableSsl = true;//SSL加密smtp.UseDefaultCredentials = true;//不跟凭据一起发送邮箱smtp.DeliveryMethod = SmtpDeliveryMethod.Network;//处理待发邮件smtp.Credentials = new NetworkCredential(@"邮箱地址", @"授权码/密码");//邮件凭据(账户密码)MailMessage mail = new MailMessage();mail.IsBodyHtml = true;//邮箱内容为Html格式mail.From = new MailAddress(@"邮箱地址);//发件人邮箱mail.To.Add(new MailAddress(@"782019024@qq.com"));//收件人邮箱mail.To.Add(@"邮箱地址");//收件人邮箱mail.Subject = @"邮箱主题";//邮箱主题mail.SubjectEncoding = Encoding.UTF8;//邮箱主题编码格式mail.Body = "邮箱内容";//邮箱正文mail.BodyEncoding = Encoding.UTF8;//邮箱正文编码mail.Attachments.Add(new Attachment(@"C:\Users\附件地址.Jpg"));//添加附件文件for (int i = 1; i < 15; i++){smtp.Send(mail);//发送邮件this.MailBody.AppendText("发送成功" + i + "");}MessageBox.Show("全部发送成功", "提示窗口", MessageBoxButtons.OK);}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }}

    这里使用的是QQ邮箱的SMTP服务器。

  • QQ在设置方面:
    邮件客户端设置:
    接收邮件服务器:imap.qq.com
    发送邮件服务器:smtp.qq.com
    账户名:您的QQ邮箱账户名(如果您是VIP邮箱,账户名需要填写完整的邮件地址)
    密码:您的QQ邮箱密码
    电子邮件地址:您的QQ邮箱的完整邮件地址

  • 如何设置IMAP服务的SSL加密方式?
    使用SSL的通用配置如下:
    接收邮件服务器:imap.qq.com,使用SSL,端口号993
    发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587
    账户名:您的QQ邮箱账户名(如果您是VIP帐号或Foxmail帐号,账户名需要填写完整的邮件地址)
    密码:您的QQ邮箱密码
    电子邮件地址:您的QQ邮箱的完整邮件地址

  • 其中IMAP和POP3两种协议的区别:
    1、POP3允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件、标记已读等),这是不会反馈到服务器上的。
    2、但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:移动邮件、标记已读等),服务器上的邮件也会做相应的动作。也就是说,IMAP是“双向”的。
    3、同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。
    4、归纳总结:IMAP可以在邮箱客户端中操作邮件,同时会反馈到邮箱服务器,但POP并没有同步邮箱服务器只能在邮箱客户端中进行操作。
    目前IMAP暂时还不支持删除文件夹和重命名文件夹的操作(后续版本中会支持)。

第二章Socket网络编程概念

  • Socket概念之通信传输流程
    1、应用层—应用程序(HTTP/FTP协议)
    2、传输层—TCP/UDP,均为传输协议。(UDP不对报文进行检查)
    3、网络层—IP地址(v4,v6)
    4、链路层(帧)—数据传送基本服务。

流程归纳:应用程序向TCP发送数据信息,之后TCP处理后的结果包在传输到IP层,最后由IP通过网络(帧)将包传送到接收端实体。
应用程序—>TCP—>IP—接收端实体

  • Socket概念之端口与TCP/UDP(IP)
    1、何为端口?端口有什么作用?端口可以用来做什么?
    端口在计算机领域中是一个非常重要的概念,为计算机通信而生。端口换言之可以比喻成“计算机中一个”软插槽””。

    何为端口(软插槽)呢?如果一台计算机中装有各种各样的程序/进程。每个程序都有一个端口(软插槽),那么另外一台远程计算机可以通过(IP:端口)直接实现异地通信。

    1.1、端口号常用的分类
    公认端口号:由Internet来进行分配一些常用的应用层程序固 定使用的端口。(其中范围:0~1023)
    注册端口:是某些登记注册的端口号,这些端口号理论上来讲 只能是授权用户打开的应用软件。(其中范围:1024开始)
    一般端口号:随时分配给请求通信的客户进程

  • 2、TCP/UDP详解
    2.1、UDP和TCP 区别:
    UDP和TCP均有校验和,但是在UDP报文中,一般不使用校验和,这样虽然可以加快传输速度但却输在准确性.。而TCP而言每次报文都有进行校验和,确保了每次传输准确性。

    2.2、(传输层)TCP建立两地通信连接,(网络层)IP负责传输数据:
    当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求,这个请求必须被送一个确切的地址。TCP将在两个应用程序之间建立通信通道,被称此为全双工通信(full-duplex)。
    此渠道会维持到某一方关闭为止。归纳来讲TCP负责将数据分割并装入IP包,然后到达IP包的时候重新组合数据,IP最后负责将包发送至接受者。

    2.3、TCP三次握手确认连接的建立
    所谓三次握手建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送三个包以确认连接的建立。在Socket编程中,这一过程由客户端执行connect(链接)来触发。

下图说明整个流程:
这里写图片描述
SYN:同步标志,该标志在建立链接时有效
ACK:确认标志,确认编号栏内包含的确认编号为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
Seq:一般用作一堆数字的简化写法。
第一次SYN_SENT(请求链接)握手时:
Client(客户端)将SYN置为1,随机产生seq=J,并将数据包发送给Server,等待Server确认。
第二次SYN_RCVD(接收请求)握手时:
server收到数据包由SYN=1知道Client请求建立链接后,server将SYN和ACK置为1(ack=J+1),随机产生seq=K,在发送给Client确认请求。
第三次ESTABLISHED(确认请求)握手时:
Client收到server的SYN和ACK包向server发送确认包ACK=1(ack=K+1),完成整体链接。即可开始传输数据。

  • 2.4、TCP四次挥手

    所谓四次挥手即终止TCP链接,就是断开客户端和服务端之间的数据传输。这个过程总共需要发送四个包以确认链接的断开。
    在Scoket编程中,这一过程由客户端或者服务端执行close来触发。

这里写图片描述
FIN_WAIT1:终止等待1
FIN_WAIT2:终止等待2
CLOSE_WAIT:结束等待
LAST_ACK:最后确认
TIME_WAIT:时间等待
第一次握手: Client发送一个FIN M,用来关闭Client对server的数据传送,
第二次握手: server接收到Client请求后并发送ACK = M+1,进行确认。
第三次握手: server再次发送一个FIM N,用来关闭server对Client的数据传送。
第四次握手: Client接收到server的FIN请求后,在此发送ACK=1(ack=K+1)进行确认最后关闭。

第三章 CSharp操作Socket编程精篇(上)

  • Socket主要有两种类型:
    是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低。

    1.1、流式Socket
    是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低。
    1.2、数据报式Socket
    是一种无连接的Socket,对应无连接的UDP服务应用,不安全,但效率高。

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

    2.1、服务端的Socket(至少需要两个)
    01、Socket(第一个)负责接收客户端连接请求(但不负责与客户端通信)。

    02、当成功接收到客户端的连接便在服务器端产生一个对应的复杂通信的Socket(第二个)
    021、在接收到客户端连接时创建。
    022、对每个连接成功的客户端,创建对应Socket负责和客户端通信。

    2.2、客户端的Socket
    01、必须指定要连接的服务器地址和端口。
    02、通过创建一个Socket对象来初始化一个到服务端的TCP连接。

代码运行图:
这里写图片描述
更具体的Socket的通讯过程,:
服务端:
01、申请一个socket。
02、绑定一个IP地址和一个端口。
03、开始侦听,等待接收连接。
客户端:
01、申请一个socket。
02、连接服务端(指向IP地址和端口号)

服务端接收到请求后创建一个Socket与客户端建立连接并进行通讯,最后原监听的Socket继续监听。
注意:负责通信的Socket不能无限创建,创建的数量和操作系统有关。

  • Socket的构造函数与方法及相关的类
    3.1、Socket有三种构造函数的方法这里只讲一种:

    Socket s = new Socket(
    AddressFamily.InterNetwork, 
    SocketType.Stream, 
    ProtocolType.Tcp);

    这个构造函数包含了:
    AddressFamily//定义可使用的寻址方案
    SocketType//定义Socket的类型
    ProtocolType//定义Socket支持的协议

    注意:
    1、端口号必须在1和65535之间,最好在1024以后。
    2、连接远程主机必须指定正在监听端口。
    例如:

    IPAddress IP = IPAddress.Parse(192.168.1.1);//IP地址
    IPEndPoint IPpoint = new IPEndPoint(IP, 9000);//端口号
    Socket serversockst = new Socket(
    AddressFamily.InterNetwork, 
    SocketType.Stream,
    ProtocolType.Tcp);//服务端Socket clientsockst = new Socket(
    AddressFamily.InterNetwork, 
    SocketType.Stream, 
    ProtocolType.Tcp);//客户端serversockst.Bind(IPpoint);//绑定一个端口和IP
    clientsockst.Connect(IPpoint);//指向一个端口和IP

    服务端和客户端IP和端口号需要一致,才能建立通讯通道。
    3、一个Socket一次只能连接一台主机。
    4、Socket关闭后无法再次使用。
    5、每个Socket对象只能与一台远程主机连接。如果你想连接到多台远程主机,必须创建多个Socket对象。

    3.2、相关的类与Socket方法
    a.相关类:
    IPAddress:包含一个IP地址
    IPEndPoint:包含一对IP地址和端口

    b.方法:
    同步:
    Socket();//创建一个Socket
    Bind();//绑定一对本地IP和端口号(IPEndPoint)
    Listen();//socket侦听正在传入的连接尝试,并指定队列中最多可容纳的等待接受的传入连接数
    Connect();//初始化与另一个Socket的连接(客户端)
    Accept();//接收连接并返回一个新的Socket(服务端)
    Send();//输出数据到Socket(发送消息)同步
    Receive();//从Socket中读取数据(读取消息)
    Close();//关闭Socket销毁连接

    异步:
    BeginConnect();//开始一个对远程主机连接的异步请求
    EndConnect();//结束挂起的异步连接请求

    例:SocketClient.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);

    BeginSend();//发送数据到Socket(发送消息)异步
    EndSend();//结束挂起的异步发送

    例:SocketClient.BeginSend(bytedata,0,bytedata.Length,SocketFlags.None,new AsyncCallback(SendCallback), client);

    BeginReceive();//接收数据
    EndReceive();//结束挂起的异步接收请求

    例:SocketClient.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);

    1、其中AsyncCallback异步委托类为相应异步操作完成后,继续调用。AsyncCallback为客户端应用程序提供完成异步操作的方法。开始异步操作时,该回调委托被提供给客户端。

    **2、**AsyncCallback引用的事件处理程序包含完成客户端异步任务的程序逻辑。

    3、在通信中,AsyncCallback中的封装你要回调的函数,state则是相当于回调函数的参数。(IAsyncResult类型)

    c.属性:
    RemoteEndPoint;//获取远程的IP 地址和端口
    LocalEndPoint;//获取本地的IP地址和端口

  • 3.3、Csharp的异步Socket与同步Socket的主要区别:
    服务端为B
    客户端为A

    1、
    假设(Socket同步的情况下)服务端B和客户端A已经三次握手,建立了链接。
    A和B之间已经可以进行通信。假如B端在请求A端的时候请求成功就发送一条数据。那么A端就可以直接拿Socket对象得到他的信息。但是假如B端并没有在连接成功后直接发送信息而是在后来不确定的时间内发送的信息。那么A端就无法得到这条信息。
    通常情况下:一个定时器去不断扫描这个数据缓存区。但是效率低下。
    所以Socket同步只适合在短时间通讯,不适合长期通讯。

    2、
    那么如何解决这个问题呢?
    这里就需要用到我们的异步传输,异步传输的原理:
    在A端得到这个Socket对象以后并不是直接去接收数据而是建立一个回调函数,回调函数由系统维护的。
    他在指定的时间自动去扫描数据存储区。假如有数据他就把数据存储到指定的字节数组中。

    总结:
    1、短时间一次连接发送数据交互信息的,适合用于同步。
    2、长时间连接发送数据交互信息的,适合用于异步。
    3、执行过程Socket:

    3.1解决方法就是通过新建一个线程,让这个线程去监听等待响应,从而将Browser从阻塞中解救出来,去处理其他的事情。按照我个人的理解,同步(阻塞)+多线程就是异步了。因为按照以上的说法,系统维护的回调函数实现的就是我们这里的新建的线程完成的功能。

    3.2说白了,同步就是自己去监听等待响应,异步是将监听等待响应的工作交给了其他的线程。

    以下程序代码只能作为Socket局域网通信的基础,如何实现互联网通信请继续往下看。

  • 3.3.1、Socket同步代码实现:
    1、SocketServer(服务端代码实现)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.Windows;
using System.Threading;namespace Sockets编程通信
{class SocketServer{private delegate void dele(object o);private delegate void deleShow(string o);private dele GoIntercept;//侦听委托private dele GoMessage;//显示委托Dictionary<string, Socket> DicSocket = new Dictionary<string, Socket>();//已连接的客户端集合TextBox SEA = null;TextBox SShow = null;TextBox SP = null;ComboBox SA = null;ServerANDClient S = null;/// <summary>/// Server服务端函数/// </summary>/// <param name="ShowErrorAndOut">提示窗口</param>/// <param name="SocketShow">显示窗口</param>/// <param name="SocketImPort">输入窗口</param>/// <param name="SocketAbutment">对接列表</param>/// <param name="s">主窗体</param>public SocketServer(TextBox ShowErrorAndOut, TextBox SocketShow, TextBox SocketImPort, ComboBox SocketAbutment,ServerANDClient s){SEA = ShowErrorAndOut;SShow = SocketShow;SP = SocketImPort;SA = SocketAbutment;S = s;}/// <summary>/// 服务端绑定IP和端口/// </summary>/// <param name="IP">本地IPv4</param>/// <param name="Point">指定端口</param>public void IPandPoint(string IP,string Point){try{IPAddress ip = IPAddress.Parse(IP);IPEndPoint IPandPont = new IPEndPoint(ip, int.Parse(Point));Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);Server.Bind(IPandPont);//绑定IP和端口Server.Listen(10);//设置最大待连接的客户端列表show("Server配置设置成功。");GoIntercept = new dele(ServerIntercept);//委托Thread th = new Thread(new ThreadStart(delegate{GoIntercept(Server);//侦听客户端对接}));th.IsBackground = true;th.Start();}catch (Exception Error) { show(Error.Message.ToString()); }}/// <summary>/// 服务端侦听可连接的对接/// </summary>/// <param name="o"></param>private void ServerIntercept(object o){Socket Server = o as Socket;try{Socket SocketClient = Server.Accept();//对接成功show("跟客户端对接成功。");show("本地:" + SocketClient.LocalEndPoint.ToString());show("远程:" + SocketClient.RemoteEndPoint.ToString());Thread thh = new Thread(new ThreadStart(delegate{S.ReconsitutionMethodLabel();}));thh.IsBackground = true;thh.Start();string IPandPoint = SocketClient.RemoteEndPoint.ToString();DicSocket.Add(IPandPoint, SocketClient);//已连接的客户端添加到集合中show3(IPandPoint);//对接列表赋值GoMessage = new dele(ServerReceive);Thread th = new Thread(new ThreadStart(delegate{GoMessage(SocketClient);//接收数据}));th.IsBackground = true;th.Start();}catch (Exception Error) { show(Error.Message.ToString()); }}/// <summary>/// 服务端接收信息数据/// </summary>/// <param name="o"></param>private void ServerReceive(object o){Socket ServerClient = o as Socket;try{while (true){byte[] buffte = new byte[1024 * 1024];int sum = ServerClient.Receive(buffte);//对客户端发送过来的数据,保存到缓冲区中。string lineTo = Encoding.UTF8.GetString(buffte);//输出到显示窗口中。show2(ServerClient.RemoteEndPoint.ToString() + "  " + DateTime.Now.ToString());show2(lineTo);show("接收消息成功");}}catch (Exception Error) { show(Error.Message.ToString()); }}/// <summary>/// 发送消息/// </summary>public void ServerShow(){try{byte[] buffte = Encoding.UTF8.GetBytes(SP.Text.ToString());DicSocket[SA.Text.ToString()].Send(buffte);//发送消息show("发送消息成功");show2(DicSocket[SA.Text.ToString()].LocalEndPoint.ToString() + "  "+ DateTime.Now.ToString());show2(SP.Text.ToString());SP.Text = "";//清空}catch (Exception Error) { show(Error.Message.ToString()); }}#region 输出/// <summary>/// 提示窗口/// </summary>/// <param name="text"></param>private void show(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate {SEA.AppendText(text.ToString() + "\r\n");}));}));th.IsBackground = true;th.Start();}catch { }}/// <summary>/// 显示窗口/// </summary>/// <param name="text"></param>private void show2(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate {SShow.AppendText("\r\n" + text.ToString());}));}));th.IsBackground = true;th.Start();}catch { }}/// <summary>/// 对接列表的赋值/// </summary>/// <param name="text"></param>private void show3(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate{SA.Text = text;}));}));th.IsBackground = true;th.Start();}catch { }}#endregion}
}

2、SocketClient(客户端代码实现)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;namespace Sockets编程通信
{class SocketClient{ServerANDClient S = null;TextBox SocketShow = null;TextBox WinDosError = null;TextBox SocketExport = null;ComboBox ComSocketClientEndPoint2 = null;/// <summary>/// Client客户端函数/// </summary>/// <param name="s">主窗体</param>/// <param name="socketshow">显示窗口</param>/// <param name="windoserror">提示窗口</param>/// <param name="socketexport">发送窗口</param>public SocketClient(ServerANDClient s, TextBox socketshow, TextBox windoserror, TextBox socketexport, ComboBox comsocketclientendpoint2){S = s;SocketShow = socketshow;WinDosError = windoserror;SocketExport = socketexport;ComSocketClientEndPoint2 = comsocketclientendpoint2;}/// <summary>/// 连接服务端配置/// </summary>/// <param name="ip">本地IP地址</param>/// <param name="point">端口号</param>public void IPandPoint(string ip,string point){try{IPAddress IP = IPAddress.Parse(ip);IPEndPoint IPendPoint = new IPEndPoint(IP, int.Parse(point));Socket SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);SocketClient.Connect(IPendPoint);//建立与远程服务端的连接SocketClientSend = SocketClient;THComIPEndPoint(SocketClient.RemoteEndPoint.ToString());//获取远程主机IP和端口THShowError("对接服务端完成");Thread th = new Thread(new ThreadStart(delegate{SocketReceive(SocketClient);}));th.IsBackground = true;th.Start();}catch (Exception e) { THShowError(e.Message.ToString()); }}Socket SocketClientSend = null;/// <summary>/// 客户端接收消息/// </summary>private void SocketReceive(object o){Socket SocketClientReceive = o as Socket;try{while (true){byte[] buffet = new byte[1024 * 1024];int sum = SocketClientReceive.Receive(buffet);//读取Socket数据信息,读取服务端发送的信息string line = Encoding.UTF8.GetString(buffet, 0, sum);THShowError("接收消息成功");THShowMess(SocketClientReceive.RemoteEndPoint + "\t" + DateTime.Now);THShowMess(line);//输出到显示窗口}}catch (Exception e) { THShowError(e.Message.ToString()); }}/// <summary>/// 客户端发送消息/// </summary>public void SocketSend(){try{SocketClientSend.Send(Encoding.UTF8.GetBytes(SocketExport.Text));THShowError("发送消息成功");THShowMess(SocketClientSend.LocalEndPoint.ToString() + "\t" + DateTime.Now);THShowMess(SocketExport.Text);//显示窗口SocketExport.Text = "";}catch (Exception e) { THShowError(e.Message.ToString()); }}#region 输出/// <summary>/// 显示窗口/// </summary>/// <param name="text"></param>private void THShowMess(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate{SocketShow.AppendText(text + "\r\n");}));}));th.IsBackground = true;th.Start();}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 提示窗口/// </summary>private void THShowError(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate {WinDosError.AppendText(text + "\r\n");}));}));th.IsBackground = true;th.Start();}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 对接服务端列表IP/// </summary>/// <param name="text"></param>private void THComIPEndPoint(string text){try{Thread th = new Thread(new ThreadStart(delegate{S.Invoke(new EventHandler(delegate{ComSocketClientEndPoint2.Text = text;}));}));th.IsBackground = true;th.Start();}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }}
}
  • 3.3.2、Socket异步代码实现:
    1、SocketClient(客户端代码实现)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Windows;
using System.Windows.Forms;
using System.Collections;namespace Socket异步通讯
{/// <summary>/// 客户端Socket/// </summary>public class Client{#region 设备信号//来自远程设备的响应public static String response = String.Empty;//服务端列表static Dictionary<string, Socket> dic = new Dictionary<string, Socket>();//static string Point = "";#endregionstatic Form1 F = null;public Client(Form1 f){F = f;}#region 异步连接/// <summary>/// 连接远程服务器发送请求/// </summary>/// <param name="remoteIP">IP</param>/// <param name="port">端口</param>public static void StartClient(string remoteIP,int port){try{//为套接字建立远程端点。IPAddress ipAddress = IPAddress.Parse(remoteIP);IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);//创建TCP/IP套接字。Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接到远程端点client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);dic.Add(client.RemoteEndPoint.ToString(), client);Point = client.RemoteEndPoint.ToString();}catch (Exception e){MessageBox.Show(e.Message.ToString());}}/// <summary>/// 连接远程主机/// </summary>/// <param name="ar"></param>private static void ConnectCallback(IAsyncResult ar){try{// 从状态对象检索套接字。Socket client = (Socket)ar.AsyncState;//完成连接client.EndConnect(ar);//接收消息Receive(client);}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }} #endregion#region 异步接收消息/// <summary>/// 异步读取消息/// </summary>/// <param name="client"></param>private static void Receive(Socket client){try{while (true){//创建状态对象StateObject state = new StateObject();state.workSocket = client;//开始服务端设备接收数据。state.workSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);}}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 异步读取消息确认/// </summary>/// <param name="ar"></param>private static void ReceiveCallback(IAsyncResult ar){try{//检索状态对象和客户端套接字//来自异步状态对象。StateObject state = (StateObject)ar.AsyncState;Socket client = state.workSocket;//接收服务端消息int bytesRead = client.EndReceive(ar);//每次接收到数据时if (bytesRead > 0){//可能有更多的数据,所以存储收到的数据到目前为止。state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));//获取其余的数据。client.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);}Thread th = new Thread(new ThreadStart(delegate{F.Invoke(new EventHandler(delegate{F.Receive(state.sb.ToString());}));}));th.IsBackground = true;th.Start();}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }} #endregion#region 异步发送消息/// <summary>/// 异步发送消息/// </summary>/// <param name="client">客户端Socket</param>/// <param name="data">数据信息</param>public static void Send(string data){try{StateObject so = new StateObject();so.workSocket = dic[Point] as Socket;//使用ASCII编码将字符串数据转换为字节数据。 byte[] bytedata = Encoding.ASCII.GetBytes(data);//开始将数据发送到服务端。so.workSocket.BeginSend(bytedata, 0, bytedata.Length, SocketFlags.None, new AsyncCallback(SendCallback), so.workSocket);}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 异步发送消息成功确认/// </summary>/// <param name="ar">异步状态</param>private static void SendCallback(IAsyncResult ar){//从状态对象检索套接字。Socket client = (Socket)ar.AsyncState;//异步开始//将数据完全发送到远程设备。//如果发送成功,返回发送的字节数,否则返回无效client.EndSend(ar);Thread th = new Thread(new ThreadStart(delegate{F.Invoke(new EventHandler(delegate{F.Receive("");}));}));th.IsBackground = true;th.Start();}#endregion/// <summary>/// 释放客户端/// </summary>public static void Release(){dic[Point].Shutdown(SocketShutdown.Both);dic[Point].Close(100);}
}

2、SocketServer(服务端代码实现)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Collections;namespace Socket异步通讯
{class Server{/// <summary>/// 存储客户IP和端口的列表/// </summary>static Dictionary<string, Socket> dic = new Dictionary<string, Socket>();/// <summary>/// 客户端IP和端口/// </summary>static string Point = "";static Form1 F = null;public Server(Form1 f){F = f;}/// <summary>/// 监听客户端请求列表/// </summary>/// <param name="IP"></param>/// <param name="port"></param>public static void StartListening(string IP,int port){IPAddress ipaddress = IPAddress.Parse(IP);IPEndPoint IPEndPoint = new IPEndPoint(ipaddress,port);Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{server.Bind(IPEndPoint);server.Listen(10);//启动异步套接字监听连接。server.BeginAccept(new AsyncCallback(Accept), server);}catch (Exception e){MessageBox.Show(e.Message.ToString());}}/// <summary>/// 连接客户端/// </summary>/// <param name="ar"></param>public static void Accept(IAsyncResult ar){try{//发送等待线程可以继续进行的信号。并释放所有等待线程//连接客户端成功Socket server = (Socket)ar.AsyncState;Socket serverClient = server.EndAccept(ar);//储存客户端列表dic.Add(serverClient.RemoteEndPoint.ToString(), serverClient);//客户端远程IP和端口Point = serverClient.RemoteEndPoint.ToString();while (true){//连接成功后接收消息StateObject state = new StateObject();state.workSocket = serverClient;//异步接收消息serverClient.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveIAsyncResult), state);}}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 接收客户端信息/// </summary>/// <param name="ar"></param>public static void ReceiveIAsyncResult(IAsyncResult ar){try{StateObject state = (StateObject)ar.AsyncState;Socket serverReceive = state.workSocket;//读取数据返回数据中的字节数int bytesRead = serverReceive.EndReceive(ar);//判断数据是否读取完毕if (bytesRead > 0){//接收字符串state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, StateObject.BufferSize));}Thread th = new Thread(new ThreadStart(delegate{F.Invoke(new EventHandler(delegate{F.Receive(state.sb.ToString());}));}));th.IsBackground = true;th.Start();}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }}/// <summary>/// 给客户端发送消息/// </summary>public static void Send(string data){try{byte[] by = Encoding.UTF8.GetBytes(data);dic[Point].BeginSend(by, 0, by.Length, SocketFlags.None, new AsyncCallback(SendIAsyncResult), dic[Point]);}catch (Exception e) { MessageBox.Show(e.Message.ToString()); }}/// <summary>/// 发送消息确认/// </summary>/// <param name="ar"></param>public static void SendIAsyncResult(IAsyncResult ar){try{Socket serverSend = (Socket)ar.AsyncState;serverSend.EndSend(ar);Thread th = new Thread(new ThreadStart(delegate{F.Invoke(new EventHandler(delegate{F.Receive("");}));}));th.IsBackground = true;th.Start();}catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }}}
}
  • Socket如何在广域网上通信?

    4.1使用端口映射,什么是端口映射呢?
    NAT(网络地址转换)
    1、端口映射是NAT的一种,功能是把公网的地址翻译成私有地址。
    2、端口映射是将一台或者多台内网主机,映射到公网IP地址,当用户访问映射端口中的某一个端口时,服务器(路由器)会将请求转移到本地局域网中某个匹配的端口主机。

    这里写图片描述

    3、端口映射专业解析:端口指定的是软件形式上的端口,不是I/O硬件进出端口,服务器可以向外提供多种服务,比如一台服务器可以有FTP,WEB软件服务,比如WEB端口80,FTP端口21。这样通过不同的端口,可以互相不干扰的情况下通信。
    4、分类:
    动态端口映射:(这里参照TCP/IP三次握手)(前提是对方服务器有对这个网页端口做出映射,内机才能进行访问。)

    4.1)、当内网中的一台电脑访问网页时,会发送一个NAT网关数据包,其中包含网页的IP和端口,本机私有IP和端口。
    4.2)、 NAT网关会把本机私有IP和端口转换成公网IP和端口,并且记住这个链接服务状态。
    4.3)、最后实现了通讯渠道,内网发送数据给网页,网页会根据数据做出反应。传输数据给内网主机。

    静态端口映射:

    NAT网关有一个固定端口,设顶此端口收到数据转发到内机中的某个IP和端口,这个固定端口永远存在的。相当访问内机的一道门,外网可以随时主动访问内网的这台内机。
    这里写图片描述

Socket套接字通讯思路:
外网通过公网IP和服务端口,访问到我的路由服务器,然后通过路由服务器找到内网的本地IP主机中的软件端口。

注:但是在建立连接的前提下,必须是运营商有授权给你访问内网的权限。通过对比WAN口状态和公网IP是否一致即可得出结果。
如图:
这里写图片描述
1、如果在这中情况就需要采用反向代理去解决这个映射问题,进行内网穿透。
2、比如我使用花生壳,当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
3、此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。
设置步骤:
1、设置映射
这里写图片描述
2、设置DMZ主机
这里写图片描述
3、设置花生壳账号,在这之前去下载花生壳软件,注册账号。
这里写图片描述

  • 4.2端口映射常见问题总结
    1、首先检查您设置的端口影射是否正确映射到您内网的服务器。即您设置的转发规则的IP地址是否为您服务器的IP地址。

    2、无法访问内网的服务器,请检查服务器是否开启了。您可以在局域网内使用其他的计算机访问一下您的服务器,确认服务器是否开启,并能成功访问。

    3、请您检查您是否映射了服务器所需的所有端口,有可能没有完全设置访问服务器所需的端口,导致访问失败。您可以通过开启“DMZ主机”来检测一下,是否端口没有映射完全。若开启DMZ主机后,能正常访问服务器,则可能是端口添加不完全。

    4、路由器上是否设置了“防火墙”,是否将服务器通信的端口过滤,导致访问失败。

    5、本机防火墙:因本地网络为信任区域,防火墙并不会阻止本地网络的访问,若访问源地址为外网地址(非信任区域地址),则可能会被防火墙拦截而无法访问;

    6、服务商将相应端口屏蔽:在路由器WAN口接一台电脑模拟内外网环境,若WAN口所接电脑可以正常访问内网服务器,但在Internet上无法访问,则可能是服务器将相应端口屏蔽导致虚拟服务器无法访问;

    注:
    1、若是80端口的WEB服务器,一定要注意路由器的远端WEB管理端口是否更改,否则两者会冲突;

    2、检查虚拟服务器是否映射成功一定要从外网进行访问,不要从内网用WAN口IP去访问,这样在测试的时候是成功的,但实际外网并不能成功访问。

    3、特殊的服务器,如网络摄像机及特殊的应用软件等,如果客户自己都不清楚通讯的端口,可先尝试DMZ主机以确认是否可以使用,同时建议客户咨询软件提供商。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Hive-Import/Export(导入导出)

    1 官方地址Hive 0.8.0 之后引入了EXPORT and IMPORT 命令。EXPORT命令将表或分区的数据连同元数据一起导出到指定的输出位置(HDFS上)。然后可以将此输出位置移至不同的Hadoop或Hive实例,并使用IMPORT命令进行导入操作。 导出分区表时,原始数据可能位于不同的HDFS位置。还支…...

    2024/4/28 0:06:01
  2. 谈谈SEO行业的三大门派——白帽SEO、黑帽SEO及灰帽SEO

    很多新手SEOer或者刚刚接触SEO行业的SEOer都会了解到SEO其实是有不同类型的,就像是武术界的峨眉派、少林派、武当派等等,SEO也分为三大门派,分别为白帽SEO、黑帽SEO以及灰帽SEO。白帽SEO什么是白帽SEO?在三大门派中,最正规也最为普遍的莫过于白帽SEO。正规白帽SEO优化需要…...

    2024/3/30 6:51:49
  3. html中button标签reset用法 -- 重置表单中填写的内容

    $("#myform").button(reset);1、$("#myform")[0].reset();2、 $("#myform").resetForm();3、 $("#myform")[0].reset() ;4、$("#myform").get(0).reset();并不是真正意义上的清空,只是还原成初始未编辑的状态...

    2024/4/18 4:24:03
  4. 【GPU精粹与Shader编程】(二) 《GPU Gems 1》全书核心内容提炼总结 · 上篇

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处 文章链接: https://zhuanlan.zhihu.com/p/35974789题图背景来自《战神4》。系列文章前言我们知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》组成的饕餮盛宴,共11本书,合称“GPU精粹三部曲“,是游戏开发…...

    2024/4/20 5:10:57
  5. 【EDSR代码问题】【Pytorch1.1】ImportError: cannot import name '_update_worker_pids' from 'torch._C'

    从5月3日开始,恢复Colab上的EDSR模型训练,文件dataloader.py开始报错:ImportError: cannot import name _update_worker_pids仔细看了下原来是Colab上默认pytorch版本变成了1.1,由于没试过Colab上pytorch版本回滚,而且可预见地认为更换版本会很麻烦(每次都需要改版本),…...

    2024/4/17 5:07:36
  6. tcl socket 编程

    tcl编程很简单,但tcl只支持tcp协议,可以通过tcl编写客户端和服务器端编写服务器端很简单,譬如socket -server callback 9999;#此处callback是一个事先写好的回调函数,需要接受三个参数socketid remote address和 remote port 如果该pc有多个网卡,缺省针对所有接口,可以通…...

    2024/4/27 21:32:43
  7. web项目中通过button按钮跳转到action中

    ...

    2024/4/17 5:08:06
  8. 1、Java从入门到精通

    将自己学习的Java基础整理出来,方便复习和记忆~~一、Java的历史1、Java开发分成了3个方向Java SE:主要用于桌面程序的开发,学习Java EE和Java ME的基础Java EE:主要用于网页程序的开发Java ME:主要用于嵌入式系统程序的开发2、Java SE平台中的lib软件包Java.lang 包——语…...

    2024/4/17 5:06:48
  9. 微信小程序 全站开发 thinkPHP 5.0+小程序商城

    需要的联系我吧微信是 chenqiliang2583 伸手党来 。 从0 到1. 视频 讲的不错...

    2024/4/17 5:06:36
  10. input与button输入框 间隙问题

    发现问题 解决问题 水平缝隙 垂直缝隙发现问题在开发中经常会遇到搜索框组,即一个input输入框和一个button点击搜索框,由于浏览器的解析原因,我想知道但是我没有找到答案,会出现即使是同样的高度,视觉上input组并没有在一条水平线上,以及会出现水平距离上的缝隙。解决问题…...

    2024/4/17 5:06:54
  11. 我收集的小程序干货汇总-前后台都有,不用谢!

    小程序开发资源!「 起因 」最近小程序生态基本已经趋于稳定,而且各大、小、创业公司都已经全面转化到小程序产品线,很多童鞋的公司主产品线都已经被小程序占领,不得不说现在 web前端和后端又要多一门基本技能:了解并开发小程序。小程序是腾讯干儿子系列,异常重视,从版本…...

    2024/4/17 8:53:25
  12. 关于Button点击两次才响应事件相关问题

    本文来自http://www.cnblogs.com/xiaoweiz/p/3833079.html首先我们来看看touch mode的定义。它是用户和手机进行交互时view层次结构的一个状态。它本身是很容易理解的,代表了最近一次的交互是否是通过触摸屏发生的,因为在Android设备上还存在别的交互方式,比如D-pad、滚动球…...

    2024/4/2 11:08:03
  13. RPG项目开发总结

    十虎项目开发回顾第一部分 项目概况 一、项目时间十虎从2009年10月正式开始,截止到2011年12月,共开发了2年2个月。游戏的最初的目标是:重现一度湮没的武林。1、最初的项目时间计划表:图1广东十虎.ppt 中关于项目时间的描述2、项目实际的时间表2009年10月项目开始时,决定20…...

    2024/4/27 21:24:33
  14. 当遇到 ImportError: cannot import name np_utils这样的问题

    在命令提示符中输入: pip install --upgrade --user keras重新启动spyder敲之前的代码 解决...

    2024/4/17 5:07:06
  15. 浅谈TCP/IP网络编程中socket的行为

    转载:http://www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等) 2. Socket I/O系统调用(重点如read/wri…...

    2024/4/17 5:07:12
  16. python下运行import sklearn.model_selection 出错ImportError: No module named model_selection解决方法

    from sklearn import datasets, svm from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix iris = datasets.load_iris() X = iris.data[:, :2] y = iris.targetwindows下anaconda的spyder运行一段python程序,遇到了import sk…...

    2024/4/17 5:05:54
  17. 03《Java从入门到精通》读书笔记

    目录第1章 初识Java1.1 Java简介1.1.1 什么是Java语言1.1.2 Java的应用领域1.1.3 Java的版本1.1.4 怎样学好Java1.1.5 JavaAPI文档1.2 Java语言的特性1.2.1 简单1.2.2 面向对象1.2.3 分布性1.2.4 可移植性1.2.5 解释型1.2.6 安全性1.2.7 健壮性1.2.8 多线程1.2.9 高性能1.2.10 …...

    2024/4/17 5:07:06
  18. 需要小程序源码/模板的进

    最近自己想要做个小程序,但一直苦于没有时间精力来自己做,就在网站各种搜集源码,终于找到了自己想要的一个商城小程序,搜集了这么多,有需要的伙伴自行扫码加小编获取...

    2024/4/28 1:19:00
  19. Socket的网络编程

    最近在做Socket网络编程相关的项目,因此在此记录下一些心得体会吧!关于基于Socket的网络编程,一般指的是开发基于C/S模式的网络程序。由于有多线程的处理,例如开发一个高性能的服务器,难度不低,我在做一个基于自定义协议的文件下载的服务器以及客户端的时候,遇到的问题确…...

    2024/4/17 5:07:36
  20. 微信小程序开发——动画效果

    WeChat小程序交流(QQ群:769977169)动画效果的实现,使用wx.createAnimation实现。具体实现时,首先,创建动画对象,并设置相关的参数;其次,设置动画类型,并执行动画;第三,导出并设置动画数据;最后,将设置的动画数据动态配置相应的组件,以此实现组件的动画效果。效果…...

    2024/4/20 1:57:29

最新文章

  1. 【AI】一文介绍索引增强生成RAG的原理和结构

    今天向大家介绍一下关于RAG的一些知识和经验。 这里说的RAG可以理解为目前针对企业知识库问答等AI应用场景的解决方案,这个场景就是利用自然语言大模型LLM与用户自有的文件进行对话的能力。 【RAG的优势】 首先,讲一讲RAG的优势特征。 如果把AI想象成一个待上岗的人类助手,…...

    2024/4/28 1:23:45
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 随行付优化外卡收单,助力支付便利化

    解决老年人和境外游客在支付过程中遇到的问题和障碍&#xff0c;正逐渐成为整个支付行业的焦点关注词汇。 在有关提高支付服务便利度的意见发布后&#xff0c;有关收单行业的好消息不断涌现&#xff1a;中国银联于3月15日宣布投入30亿元用于升级基础设施&#xff0c;促进支付便…...

    2024/4/25 2:13:29
  4. 16个Python接单平台,做私活爽歪歪!(附100个爬虫源码)

    一、python爬虫是可以做副业的&#xff0c;主要是爬取网站、小程序或者APP的数据&#xff0c;对数据进行分析与处理&#xff0c;或者直接向客户提供爬虫程序与技术支持。 当初学会Python那会儿&#xff0c;有朋友来介绍我去接私活&#xff0c;是为一家公司做网站&#xff0c;那…...

    2024/4/26 8:46:13
  5. Jenkins 使用 Description Setter

    想要的效果如图: 在打包完成之后直接在构件历史的部分展示出来构建的docker镜像名,这样就不需要去找日志了。 首先安装插件 Description Setter, 如何安装就不在此赘述了。 安装完成之后&#xff0c;在构件后操作选项添加一个流程&#xff0c; 有两个字段: regular expressi…...

    2024/4/25 1:28:42
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57