private void send(P2pMessage message) { try { MemoryStream mStream = new MemoryStream(); //DataContractSerializer formatter = new DataContractSerializer(message.GetType()) ; IFormatter formatter = new BinaryFormatter(); //formatter.WriteObject(mStream, message); formatter.Serialize(mStream, message); mStream.Flush(); mStream.Position = 0; byte[] buff = new byte[4096]; int len = 0; NetworkStream nStream = serverSocket.GetStream(); while ((len = mStream.Read(buff, 0, buff.Length)) > 0) { nStream.Write(buff, 0, len); } mStream.Flush(); mStream.Position = 0; } catch (System.Exception ex) { Console.WriteLine(ex.ToString()); } }
//发送消息的button private void sendBtn_Click(object sender, EventArgs e) { string msg = sendRichBox.Rtf; sendRichBox.Text = String.Empty; P2pMessage message = new P2pMessage(); message.HostId = hostId; message.GuestId = guestItem.ID; message.GuestName = session.User.Username; message.Contents = msg; message.Time = DateTime.Now; message.Face = ""; message.image = ""; //判断对方是否在线,不在就存到数据库中 if (guestModel.Status == 1) { this.send(message); } else { MessageBll.addP2pMessage(message);//保存数据库 } this.appendText(message); }
protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List <object> output) { byte[] encoded = new byte[input.ReadableBytes]; input.ReadBytes(encoded); P2pMessage message = (P2pMessage)this.message_factory.Create(encoded); Logger.Info( string.Format("Handshake Receive from {0}, {1}", context.Channel.RemoteAddress, message)); switch (message.Type) { case MsgType.P2P_HELLO: HandleHelloMessage(context, (HelloMessage)message); break; case MsgType.P2P_DISCONNECT: if (this.channel.NodeStatistics != null) { this.channel.NodeStatistics.NodeDisconnectedRemote(((DisconnectMessage)message).Reason); } this.channel.Close(); break; default: this.channel.Close(); break; } }
private void service() { while (receiveFlag) { P2pMessage msg = null; //接收到的信息对象,放这里主要是为了解决appendText的异步问题 try { this.serverSocket = P2pServerSocket.socketDict[guestId]; byte[] buff = new byte[4096]; MemoryStream mStream = new MemoryStream(); mStream.Position = 0; NetworkStream nStream = serverSocket.GetStream(); while (true) { int len = nStream.Read(buff, 0, buff.Length); mStream.Write(buff, 0, len); if (len < 4096) { break; } } BinaryFormatter formmater = new BinaryFormatter(); //DataContractSerializer formmater = new DataContractSerializer(typeof(P2pMessage)); //mStream.Flush(); mStream.Position = 0; if (mStream.Capacity > 0) { //msg = (P2pMessage)formmater.ReadObject(mStream); msg = formmater.Deserialize(mStream) as P2pMessage; appendText(msg); } }catch (System.Runtime.Serialization.SerializationException ex) { Console.WriteLine(ex.ToString()); } catch (System.ObjectDisposedException ex) { string test = ex.Message; //appendText(msg); } catch //如果对方退出了程序 { if (serverSocket != null) { serverSocket.Close(); serverSocket = null; } if (P2pServerSocket.socketDict.ContainsKey(guestId)) { P2pServerSocket.socketDict.Remove(guestId); } initSocket(); Thread.Sleep(1000); } } }
public delegate void InvokeDelegate(P2pMessage msg); //事件委托,跨线程调用winform控件需要 private void appendText(P2pMessage msg) //给messageBox添加 { if (messageRichBox.InvokeRequired) { InvokeDelegate invoke = new InvokeDelegate(appendText); this.Invoke(invoke, new object[] { msg }); } else { this.messageRichBox.AppendText(msg.GuestName + " [" + msg.Time.ToString() + "] \r\n"); this.messageRichBox.AppendRtf(msg.Contents); this.messageRichBox.AppendTextAsRtf("\r\n"); this.messageRichBox.ScrollToCaret(); } }
public abstract void write(P2pMessage message);
public abstract void read(P2pMessage message);