//適当なCloseフレームを送信し、切断する。
	public void Disconnect()
	{

		try
		{
			//切断応答
			var close_fragment_header = new WebSocketFragmentInfo();
			close_fragment_header.FIN = true;
			close_fragment_header.Opcode = WebSocketFragmentOpcode.ConnectionClose;
			close_fragment_header.MASK = false;
			close_fragment_header.PayloadLengthBits = PayloadLengthBits.Bits_7;

			byte[] binary = close_fragment_header.ToBinary();
			lock(send_lock_object)
			{
				stream.Write(binary,0,binary.Length);
			}

			Socket.Shutdown(SocketShutdown.Both);
		}finally{
			stream.Close();
			Socket.Close();
		}
	}
	public void SendMessage(WebSocketMessage msg)
	{
		//フラグメントヘッダを生成する
		var wsfi = new WebSocketFragmentInfo();
		wsfi.FIN = true;
		wsfi.Opcode = msg.IsTextData ?
		WebSocketFragmentOpcode.Text : 
		WebSocketFragmentOpcode.Binary;
		
		wsfi.MASK = false;
		
		byte[] data = msg.GetData();

		if(data.Length <= 125)
		{
			wsfi.PayloadLengthBits = PayloadLengthBits.Bits_7;
		}else if(data.Length <= 65535){
			wsfi.PayloadLengthBits = PayloadLengthBits.Bits_23;
		}else{
			wsfi.PayloadLengthBits = PayloadLengthBits.Bits_71;
		}

		wsfi.PayloadLength = (ulong)data.LongLength;
		byte[] fragment_header_data = wsfi.ToBinary();

		//データを送信。
		lock(send_lock_object)
		{
			stream.Write(fragment_header_data,0,fragment_header_data.Length);
			stream.Write(data,0,data.Length);
		}
	}