xml地图|网站地图|网站标签 [设为首页] [加入收藏]
Socket网络通讯,引用类型对象的深拷贝
分类:编程

Python中的对象时期赋值时是按援引传递的,倘若要求拷贝对象,须求选取标准库中的copy模块。

c#中的对象轮廓分为值类型和引用类型,值类型大约包蕴 int, string, struct等,引用类型大概包罗 自定义Class,object 等。

互联网编制程序

1、copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

值类型直接存储对象,而引用类型存款和储蓄对象的地址,在对援引类型举办复制的时候,也只是复制对象的地点。

        使用C#开展互连网编制程序时,日常都亟需用到System.Net命名空间、System.Net.Sockets命名空间和System.Net.Mail命名空间;

2、copy.deepcopy 深拷贝 拷贝对象及其子对象

全盘复制二个援引类型对象首要有两种方法:

1.额外增添三个构造函数,入参为待复制对象(假使字段为引用类型,须求继续增多构造函数,那样境况会变的拾分复杂。)

    public class Test1
    {
        private int field1;
        private int field2;
        private int field3;
        public Test1()
        { 

        }

        public Test1(Test1 test1)
        {
            this.field1 = test1.field1;
            this.field2 = test1.field2;
            this.field3 = test1.field3;
        }
    }

2.利用系列化反系列化(对品质会有杀伤)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.WriteLine(t1.list.Count);
            Test t2 = (Test)Clone(t1);
            t2.list.Add("");
            Console.WriteLine(t2.list.Count);
            Console.WriteLine(t1.list.Count);
            Console.ReadLine();
        }

        public static object Clone(object obj)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            ms.Position = 0;
            return (bf.Deserialize(ms)); ;
        }
    }

    [Serializable]
    public class Test
    {
        public List<string> list = new List<string>();
    }
}

3.行使反射(测量试验了一个网络的接口可用,但是对品质杀伤和连串化反种类化卓殊,而且对代码混淆有一定影响。   

1. System.Net命名空间:为当前网络上行使的七种说道提供了简要的编程接口。

 

  1. DNS类:DNS是叁个静态类,它从Internet域名系统(DNS)检索有关特定主机的消息,在IPHostEntry类的实例中回到来自DNS查询的主机新闻。(GetHostName()找到地点系统的主机名,然后再用GetHostByName()找到主机的IP地址)
  2. IPAddress类:包含计算机在IP互连网上的地方,主要用于提供网际合同(IP)地址。
  3. IPEndPoint类包蕴应用程序连接到主机上的劳务所急需的主机和地点或远程端口音讯。主要用于将网络端点表示为IP地址和端口号。
  4. WebClient类:提供向U本田CR-VL标志的其他地点、Intranet或Internet财富发送数据以至从这一个能源接收数据的公共措施。
  5. WebRequest类:.Net Framework的呼吁/响应模型的画饼充饥基类,用于访谈Internet数据。使用该必要/响应模型的应用程序可以用左券不可以知道的章程从Internet央浼数据。

那篇博客首要通过代码说美赞臣(Meadjohnson)下对象赋值、浅拷贝和深拷贝三者的界别。

2. System.Net.Sockets命名空间

先是区分一下可变对象和不可变对象:

        首要提供制作Sockets互联网应用程序的相关类,个中Socket类,TcpClient类、TcpListener类和UdpClient类较为常用。在.NET框架下支付时,直接动用System.Net.Sockets名称空间中的Socket类编程较为复杂,而应用层的类TcpClient、TcpListener 和 UdpClient为 Socket 通讯提供了更简约、对用户更温馨的接口。它们和Socket类之间的这种档次关系如图

  • 不可变对象:一旦创设就不足修改的目的,包含字符串、元组、数字 
  • 可变对象:能够修改的目的,包含列表、字典。

图片 1

运用范围:

(1)Socket类:重要用以处理总是(将应用程序与端口连接起来,端口是一台Computer的数额都经过此接二连三网络, Socket是依赖流套接字合同(TCP合同)/基于数据报套接字合同(UDP合同)最为通用的API。),达成Beck雷通信端套接字接口,同临时间它还定义了绑定、连接互连网端点及传输数据所需的各类情势。

  • 切开能够采纳于:列表、元组、字符串,但不能够动用于字典。 
  • 浓度拷贝,既可采用体系(列表、元组、字符串),也可使用字典。
    1. void Bind(IPEndPoint localEP):绑定地址,使Socket与二个地点终节点相关联。
    2. Void Connect(IPEndPoint ip):创设连接
    3. Void Listen(int backlog):将Socket置于侦听状态, backlog最多可连接数。
    4. Int Receive(byte[] buffer):接收数据
    5. Int Receive (byte[] buffer,ref IPEndPoint ip):从钦点地方接收数据
    6. Int Send(byte[] buffer):发送数据
    7. Int Send To(byte[] buffer,ref IPEndPoint remoteIP):向钦命地方发送数据
    8. Void Shutdown(SocketShutdown how):关闭套接字,how钦定不在允许试行的操作

 

注:使用accept函数创立新的接连时,并不是使用原本的Socket举办通讯,而是回到一个新的Socket套接字实行连接通讯。原本的Socket继续步向监听状态,等待客人的连天须求。

对象赋值:

(2)TcpClient类:基于Socket类营造,用于在一块儿阻止格局下通过互联网来连接,发送,接收数据。

will = ["train", 28, ["File", "Edit", "View"]]
wilber = will
print(id(will))
print(will)
print([id(ele) for ele in will])
print(id(wilber))
print(wilber)
print([id(ele) for ele in wilber])

will[0] = "test"
will[2].append("Navigate")
print(id(will))
print(will)
print([id(ele) for ele in will])
print(id(wilber))
print(wilber)
print([id(ele) for ele in wilber])

        那是它亦能够更加高的悬空程度提供TCP服务的根底。突显在互联网数据的出殡和经受地点,是TcpClient使用NetworkStream互连网流管理本领,使得它读写多少进一步方便直观。TcpClient类专为客户端设计,它为 TCP 互连网服务提供顾客端连接。

实践代码,结果为:

(3)NetworkStream网络流:能够被视为多个数据通道,架设在多少来源端(顾客Client)和接收端(服务Server)之间,通过TcpClient.GetStream方法,再次来到用于发送和接收数据的互联网流NetworkStream。

图片 2

        注:要开创NetworkStream必得提供连接的Socket.暗许意况下关闭NetworkStream并不会停业所提供的Socket.要是要关门Socket权限,则必需将ownsSocket构造函数参数的值钦点为true.而后的数额读取及写入均指向这么些通道来举办。不帮忙对网络流的放肆拜望。

上边来分析一下这段代码:

演示如下:通过以下办法得到NetworkStream互连网流之后,就能够利用专门的学问流读写方法Write和Read来发送和经受多少了。

  • 先是,创造了七个名叫will的变量,这几个变量指向多个list对象,从第一张图中得以见见有着指标的地点(每回运行,结果大概不一样)
  • 接下来,通过will变量对wilber变量进行赋值,那么wilber变量将对准will变量对应的靶子(内部存款和储蓄器地址),也正是说"wilber is will","wilber[i] is will[i]"可见为,Python中,对象的赋值都以进展对象引用(内存地址)传递
  • 其三张图中,由于will和wilber指向同八个指标,所以对will的别样更改都会映将来wilber上这里供给小心的有个别是,str是不足变类型,所以当修改的时候会交替旧的对象,爆发二个新的地址2090725708104
1 TcpClient tcpClient = new TcpClient();             //创建TcpClient对象实例
2 tcpClient.Connect("www.baidu.com",4088);         //尝试与远程主机相连
3 NetworkStream stream=tcpClient.GetStream();      //获取网络传输流

 

  1. BeginRead():从NetworkStream最早一步读取
  2. BeginWrite():最初向流异步写入
  3. Close():关闭NetworkStream
  4. EndRead():管理异步读取甘休
  5. EndWrite():管理异步写入停止
  6. Flush():刷新流中的数额
  7. Read():从流中读取
  8. ReadByte():从流中读取八个字节,并将流内的职责向前推动叁个字节。达到最后,重返-1。
  9. Write():将数据写入NetworkStream
  10. WriteByte():将一个字节写入流内的当前职责,并将流内的岗位向前推进三个字节。

浅拷贝:

Server:获取基础网络Socket

本文由澳门新葡亰手机版发布于编程,转载请注明出处:Socket网络通讯,引用类型对象的深拷贝

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文