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参数