首页 / Unity3d / C#

读一读

string s="hello";
string s2=@"C:\chicai"; //@表示不转义
s.Length  //获取字符串长度

StringBuilder builder=new StringBuilder()
builder.Append("haha");//在后面追加
//这个不产生太多的垃圾,需要经常修改的字符串可以用这个

object、string、dynamil

System.Object  System.String  System.Dynamil


int  其实是System.Int32

bool   System.Boolean

struct 名字{值和方法}

enum Days{Monday,.....}  枚举


JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json.txt"));
JsonData notes = jsonData["employees"];//获取到数组
for (int i = 0; i < notes.Count; i++) {
    Console.WriteLine(notes[i]["firstName"]);//获取到对象
}

Skill[] skillArray = JsonMapper.ToObject<Skill[]>(File.ReadAllText("文件名"));

Skill类里面的属性要与json里面对应,模型对应

注意,c#没有内置的json解析器,需要下载,这里用的是LitJSON,下载dll文件,引入即可


也可以使用UnityEngine内置的JsonUtility类来解析json数据。

[Serializable]
public class Data
{
    public int status;
    public string msg;
    public string WaterMark;
}

Data data = null;
try
{
    data = JsonUtility.FromJson<Data>(json);
}
catch (Exception e)
{
    yield break;
}

XmlDocument xml = new XmlDocument();
xml.Load("xml.txt");//需要加载的XML文件

XmlNode firstNode = xml.FirstChild;//获取第一个节点
Console.WriteLine(firstNode.Name);//获取节点的名称
Console.WriteLine(firstNode.NextSibling.Name);//获取下一个节点的名称
Console.WriteLine(firstNode.Attributes["time"].Value);//获取第一个节点属性time的值
XmlNodeList nodes = firstNode.ChildNodes;//获取第一个节点的所有子节点
foreach (XmlNode node in nodes) {
    Console.WriteLine(node.Name);
    Console.WriteLine(node.InnerText);//获取节点的类容
}

XmlDocument 在System.Xml 命名空间里

注意,Xml文件如果有声明项xml,它将为第一个节点

XmlElement  ele = Node["字标签名"];


string[] strs = File.ReadAllLines("文件路径");//读取所有行,返回字符串数组
byte[] datas = File.ReadAllByte("文件路径");//一般读取文件等字节型数据
string str = File.ReadAllText("文件路径");//返回所有的数据为一个字符串

服务端

1.创建socker

Socket tcpServer = new Socket(
AddressFamily.InterNetwork,//内网
SocketType.Stream,//传输类型
ProtocolType.Tcp);//协议

2.绑定ip跟端口号

IPAddress ip = new IPAddress(new byte[]{192,168,252,8});
EndPoint point = new IPEndPoint(ip,7788);  //封装ip和端口,终端
tcpServer.Bind(point);//绑定

3.监听和发送消息

tcpServer.Listen(100);//最大绑定数
Socket client = tcpServer.Accept();//暂停当前线程,直到有客户端连接
//使用返回的Socket进行通信
string message = "hello 欢迎你";
byte[] data = Encoding.UTF8.GetBytes(message);
client.Send(data);

 

客户端

1.创建Socket

Socket cilent = new Socket(
AddressFamily.InterNetwork,//内网
SocketType.Stream,//传输类型
ProtocolType.Tcp);//协议

2.发起建立连接的请求

IPAddress ip = IPAddress.Parse("192.168.252.8");
EndPoint point = new IPEndPoint(ip,7788);
client.Connect(point);
byte[] data = new byte[1024];
int length = client.Receive(data);
string message = Encoding.UTF8.GetString(data,0,length);

实例运用中,服务器建立一个客户端类,用来管理客户端的收发信息,在主程序中用一个客户端类集合管理全部的客服端。

需要不停接受,不停监听的都要开启一个线程

 

TcpListener  TcpClient  使用NetworkStream类表示网络。用GetStream返回网络流,再调用Read   Write方法读写数据


Thread t = new Thread(方法名);
t.start(参数可有可无);//定义方法的参数时类型必须是object的
Thread t = new Thread(() => {});  //Lambda表达式

通过定义类的属性,方法,在方法中调用属性(当做参数)

将此类的对象方法传给线程,对象的属性就可以作为传递的参数了


前台线程在Main线程结束时不杀掉,后台就杀掉,默认线程是前台线程

t.isBackground; //是否是后台线程
t.Abort();//终止此线程
t.Join();//等待该线程完成,再执行下面代码

委托名.BeginInvoke(参数..., ar =>
{
    int(返回类型) res = 委托名.EndInvoke(ar);
});

用委托开启一个线程   

IAsyncResult ar =  委托名.BeginInvoke(参数...,回调函数,回调函数参数)

回调函数在线程结束的时候调用


ar.isCompleted;//可以判断线程是否结束
ar.AsyncWaitHanle.WaitOne(等待最大时间);//暂停到线程完成时

如果线程在最大时间内结束返回true,否则返回false


返回结果 = 委托名.EndInvoke(ar);
ar.AsyncState;//获取回调函数传的参数,用来传委托名过来等

回调函数自动传递IAsyncResult ar参数