Socket通信相关知识点总结
目录
优秀博客记录
byte[i] & 0xFF原因(byte为什么要与上0xff?)
https://www.cnblogs.com/originate918/p/6378005.html
https://www.cnblogs.com/MCSFX/p/11027160.html
protobuf,json,xml,binary,Thrift之间的对比
http://blog.sina.com.cn/s/blog_406127500102uy6e.html
https://blog.csdn.net/qq_30270931/article/details/80483124
Socket通信原理简单理解
socket编程入门:玩转socket通信技术
http://c.biancheng.net/socket/
Int 和 byte 转换
/**
* int转byte[]
* 该方法将一个int类型的数据转换为byte[]形式,因为int为32bit,而byte为8bit所以在进行类型转换时,知会获取低8位,
* 丢弃高24位。通过位移的方式,将32bit的数据转换成4个8bit的数据。注意 &0xff,在这当中,&0xff简单理解为一把剪刀,
* 将想要获取的8位数据截取出来。
* @param i 一个int数字
* @return byte[]
*/
public static byte[] int2ByteArray(int i)
{
byte[] result = new byte[4];
result[0] = (byte)((i >> 24) & 0xFF);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}
/**
* byte[]转int
* 利用int2ByteArray方法,将一个int转为byte[],但在解析时,需要将数据还原。同样使用移位的方式,将适当的位数进行还原,
* 0xFF为16进制的数据,所以在其后每加上一位,就相当于二进制加上4位。同时,使用|=号拼接数据,将其还原成最终的int数据
* @param bytes byte类型数组
* @return int数字
*/
public static int bytes2Int(byte[] bytes)
{
int num = bytes[3] & 0xFF;
num |= ((bytes[2] << 8) & 0xFF00);
num |= ((bytes[1] << 16) & 0xFF0000);
num |= ((bytes[0] << 24) & 0xFF0000);
return num;
}
Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(IPAddress.Parse(host), port);
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(sendCallback), socket);
socket.BeginReceive(stateObject.buffer, 0, stateObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), stateObject);
public void Disconnect()
{
try
{
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Both);
}
socket.Close();
}
}
定时器
this.timer = new Timer();
timer.Interval = 30;
timer.Elapsed += new ElapsedEventHandler(sendHeartBeat);
timer.Enabled = true;
public void stop()
{
if(this.timer != null)
{
this.timer.Stop();
this.timer.Dispose();
this.timer = null;
}
}
Protobuf
反序列化
var cis = new pb.CodedInputStream(buffer, offset, buffer.Length - offset);
T t = new T();
t.MergeFrom(cis);
序列化
MemoryStream m = new MemoryStream();
var cos = new pb.CodedOutputStream(m);
msg.WriteTo ( cos );
cos.Flush ( );
return m.ToArray ( );//byte[]
项目socket通信逻辑整理