有啥问题?服务器响应消息的不同结果

Posted

技术标签:

【中文标题】有啥问题?服务器响应消息的不同结果【英文标题】:What is the wrong? Different results of the server response message有什么问题?服务器响应消息的不同结果 【发布时间】:2016-08-09 06:20:03 【问题描述】:

我想知道,代码中的错误是什么。

我想得到一个正确的结果。

但是现在,在服务器端发送奇怪的结果。

下面的链接是参考。

https://firebase.google.com/docs/cloud-messaging/server#choose

结果如下。

connect ready
host: fcm-xmpp.googleapis.com, and port: 5236
connect ok
connect!
msg: <stream:stream
to="gcm.googleapis.com"version="1.0"xmlns="jabber:
   client"xmlns:stream="http://eth    erx.jabber.org/streams">
channelConnected
e.getMessage(): BigEndianHeapChannelBuffer(ridx=0, widx=7, cap=7)
MessageDumpByte> - length:<7>

[0000] 15 03 01 00  02 02 46                                 ......F
messageReceived: 

添加到,贴出了我自己做的简单代码。

public class client2

final String host = "fcm-xmpp.googleapis.com";
// final String host = "127.0.0.1";
final int port = 5236;
Channel channel = null;

public static void main(String[] args) throws Exception

    client2 client = new client2();
    client.init();


public void init()

    ClientBootstrap bootstrap = new ClientBootstrap(
            new NioClientSocketChannelFactory(
                    Executors.newCachedThreadPool(),
                    Executors.newCachedThreadPool()));

    bootstrap.setPipelineFactory(new ChannelPipelineFactory()
    
        public ChannelPipeline getPipeline() throws Exception
        
            return Channels.pipeline(new ClientHandler());
        
    );

    System.out.println("connect ready");
    System.out.println("host: " + host + ", and port: " + port);

    ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
            port));
    channel = future.getChannel();

    System.out.println("connect ok");



class ClientHandler extends SimpleChannelUpstreamHandler


private ChannelBuffer firstMessage;
private final AtomicLong transferredBytes = new AtomicLong();

public ClientHandler()



public long getTransferredBytes()

    return transferredBytes.get();


@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)


    System.out.println("connect!");

    StringBuilder msg = new StringBuilder();

    msg.append("<stream:stream to=").append("\"")
            .append("gcm.googleapis.com").append("\"").append("version=")
            .append("\"").append("1.0").append("\"").append("xmlns=")
            .append("\"").append("jabber:client").append("\"")
            .append("xmlns:stream=").append("\"")
            .append("http://etherx.jabber.org/streams").append("\"")
            .append(">");

    System.out.println("msg: " + msg.toString());

    firstMessage = ChannelBuffers.copiedBuffer(msg.toString(),
            CharsetUtil.UTF_8);
    e.getChannel().write(firstMessage);



@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)

    System.out.println("e.getMessage(): " + e.getMessage());
    transferredBytes.addAndGet(((ChannelBuffer) e.getMessage())
            .readableBytes());

    ChannelBuffer cb = (ChannelBuffer) e.getMessage();
    byte[] message = cb.array();

    try
    
        String dump = Utility.MessageDumpByte(message);
        System.out.println(dump);
        System.out.println("messageReceived: "
                + new String(message, "UTF-8"));
    
    catch (Exception e1)
    
        e1.printStackTrace();
    



我使用 jdk 1.7,Netty 版本 3.X

并参照本文档制作。

    https://github.com/xose/netty-xmpp

    http://www.programcreek.com/java-api-examples/index.php?source_dir=gcm_server-master/src/com/grokkingandroid/sampleapp/samples/gcm/ccs/server/CcsClient.java#

【问题讨论】:

【参考方案1】:

您缺少的是必须首先建立 TLS 连接(文档中对此进行了非常清楚的解释)。

您收到的回复说:

0x15       Alert
0x03 0x01  TLS version 1.0
0x00 0x02  Message Length
0x02       Fatal
0x46       Certificate unknown

那么,去学习如何使用netty的SSL handler吧。

【讨论】:

感谢您的回答。我发现了问题。它有效。 @ArthurThompson These

以上是关于有啥问题?服务器响应消息的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以自定义 HTTP 响应状态?

图片中的http响应消息有啥问题?

请问重定向与请求转发有啥区别?

TCP和UDP的代理服务器有啥差别?

来自服务器的响应不正确的 HTTP Content-Length 会导致客户端出现不同的结果

需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有啥问题