2 qq 40093149 qq_40093149 于 2018.03.08 11:17 提问

netty client server交互问题

Server与Client建立连接后,会执行以下的步骤:

1、Client向Server发送消息

2、Server接收客户端发送的消息,并解析,根据解析内容向客户端发送消息
3、客户端接收到服务端消息,解析,根据解析结果,再发给客户端。
知道出现结束标志。

4个回答

daidaineteasy
daidaineteasy   Ds   Rxr 2018.03.08 15:48
已采纳

private void handleWebSocketFrame(ChannelHandlerContext ctx,
WebSocketFrame frame) {

    // 是否关闭
    if (frame instanceof CloseWebSocketFrame) {
        if(null != ctx && null != ctx.channel()){
            handshaker.close(ctx.channel(),
                    (CloseWebSocketFrame) frame.retain());
        }
        return;
    }

    // 是否ping
    if (frame instanceof PingWebSocketFrame) {
        ctx.channel().write(
                new PongWebSocketFrame(frame.content().retain()));
        return;
    }

    // 非文本
    if (!(frame instanceof TextWebSocketFrame)) {
        throw new UnsupportedOperationException(String.format(
                "%s frame types not supported", frame.getClass().getName()));
    }

    // 接收到的消息
    String msg = ((TextWebSocketFrame) frame).text();
    // 发送者的通道
    Channel incoming = ctx.channel();

    if(StringUtils.isEmpty(msg)){
        return;
    }else if("@heart".equals(msg)){
        // 收到心跳包,不做处理

// System.out.println("received[" + QuestionsAndAnswersUtil.getChannelUserId(incoming) + "]msg:" + msg);
return;
}else if ("1".equals(msg)){
return;
}

    JSONObject jsonMsg = null;
    try{
        jsonMsg = JSONObject.fromObject(msg);
    }catch(JSONException e){

    }

    if(null == jsonMsg){
        // 收到的数据不是json格式数据,做普通聊天内容处理
        dataCache.channels.writeAndFlush(new TextWebSocketFrame("["
                + QuestionsAndAnswersUtil.getChannelUserId(incoming) + "]:" + msg + "\n"+"online user num:"+dataCache.channels.size()));
        return;
    }

    String type = jsonMsg.getString("type");

    switch (type) {
    case QuestionsAndAnswers.PackType.USER_ANSWER:
        questionsAndAnswersService.userAnswer(ctx,jsonMsg);
        break;
    default:
        break;
    }
qq_40093149
qq_40093149 谢谢您了,我自己再看看
4 个月之前 回复
baidu_30233079
baidu_30233079   2018.03.08 11:49

你要问什么问题?麻烦写出问题

qq_40093149
qq_40093149 回复qq_40093149: 举个例子来说,客服端和服务端建立连接后,client端向server端发送经过编解码的消息,是byte[]字节数组类型的消息,server端给client端返回数据,client端收到消息后进行解码,根据解码的内容,再向server端发送请求数据的命令。一直这样交互,直到client端解码出现结束的标志。
4 个月之前 回复
qq_40093149
qq_40093149 我的问题是,举个例子来说:
4 个月之前 回复
daidaineteasy
daidaineteasy   Ds   Rxr 2018.03.08 12:03

题主,你是想要“netty实现 server client通信”实例或教程么,这个百度一下就好了。

只要建立起来Socket连接,你想client给server发也行,server给client发也行,将socket连接断开也行,你想怎么用就怎么用的了。

daidaineteasy
daidaineteasy 回复qq_40093149: 流程你已经描述清楚了,实现就是把流程写成代码了。
4 个月之前 回复
qq_40093149
qq_40093149 回复晓呆同学: 嗯,我想问一下,按照你说的那个例子,client端如果传给server端的是order,那么sever端返回的数据是订单的信息,比如说订单信息(例如购物)上面有他的地址,client收到订单信息后对订单解析,如果收货是北京,就发送北京仓库发货的请求给server,如果收货是上海,就发送上海仓库发货请求给server,然后server在根据请求,返回数据给client。。。就是类似的流程吧,有类似的netty的例子吗,或者能给我写个简单的demo吗
4 个月之前 回复
daidaineteasy
daidaineteasy 回复qq_40093149: 我们也可以传字节数组,收到字节数组之后,先对字节数组进行处理,处理完后再做对应的操作。但是字节数组怎么传,这都是我们自己定义的。这里有一个例子,你可以看下:http://blog.csdn.net/daidaineteasy/article/details/78494467
4 个月之前 回复
daidaineteasy
daidaineteasy 回复qq_40093149: 我们可以传json字符串,通过type字段的值来确定执行什么操作。我们收到数据后,获取type的值如果type=order 则查询订单,如果type=goods则查询商品,如果type=close则断开连接
4 个月之前 回复
daidaineteasy
daidaineteasy 回复qq_40093149: 通道建立起来了,传什么样的数据格式就是我们自己说了算了。可以直接传String字符串,打个比方,如果我们有两个查询功能,查询订单和查询商品,如果我们收到的是order我们就执行查询订单功能,如果是goods我们就执行查询商品功能。
4 个月之前 回复
qq_40093149
qq_40093149 不是想要实例,是不太清楚数据交互的过程。
4 个月之前 回复
daidaineteasy
daidaineteasy   Ds   Rxr 2018.03.08 15:12

1 /**
2 * 基于TCP协议的Socket通信,实现用户登录,服务端
3 */
4 //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
5 ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口
6 //2、调用accept()方法开始监听,等待客户端的连接
7 Socket socket = serverSocket.accept();
8 //3、获取输入流,并读取客户端信息
9 InputStream is = socket.getInputStream();
10 InputStreamReader isr =newInputStreamReader(is);
11 BufferedReader br =newBufferedReader(isr);
12 String info =null;
13 while((info=br.readLine())!=null){
14 System.out.println("我是服务器,客户端说:"+info);
15 }
16 socket.shutdownInput();//关闭输入流
17 //4、获取输出流,响应客户端的请求
18 OutputStream os = socket.getOutputStream();
19 PrintWriter pw = new PrintWriter(os);
20 pw.write("欢迎您!");
21 pw.flush();
22
23
24 //5、关闭资源
25 pw.close();
26 os.close();
27 br.close();
28 isr.close();
29 is.close();
30 socket.close();
31 serverSocket.close();

daidaineteasy
daidaineteasy 回复qq_40093149: 我这倒是有一个netyy的websocket项目,需要的话 可以发给你当做个例子
4 个月之前 回复
qq_40093149
qq_40093149 这个我清楚,我是不会用netty写
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!