sbf胜博发娱乐城请问该如何选择微信公众号的类型?

( sbf胜博发娱乐城 )

同学想做一个微信商城,主要是配送菜品。

界面基本如下,非广告。

  1. 我试着给做,但是没有微信平台的开发经验,在选择微信平台类型的时候不知道选择哪种?

  2. 除了订阅号,都需要企业认证之类的,他现在只有几个同学,没有组织代码或者对公账户,该如何做?

商城要支持微信支付,所以你要申请服务号

最好是有两个,一个订阅号,一个服务号。
订阅号用于像用户推送最新消息,服务号用于对接微信接口,如登录、支付什么的,因为订阅号不能对接登录、支付。

根据需求选择不同类型的公众号.订阅号可以每天群发一条推送消息,服务号一个月才能群发四条推送消息.
订阅号功能比较少,只是适合个人或者媒体,每天向用户提供信息和资讯,主要实现宣传,扩大影响力的功能
服务号与订阅号相比,具有较多的功能,比较关键的就是网页授权接口,获取用户基本信息接口以及支付,有网页授权和获取用户基本信息,就可以免除用户注册的步骤.
如果有实体店,可以选择订阅号,实现宣传的功能,或者服务号,实现在线点餐支付的功能.
如果没有实体店,建议选择服务号,这样用户使用比较方便,前提,以及有一定基数的用户了解你们.不然,宣传也要费一番精力.
最主要的还是根据需求来进行选择.以上只是个人看法和建议
注:没有组织代码或者对公账户,可以理解为没有营业执照吗,我对这方面不是太懂,你们是准备无证经营吗:)

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网为什么Calendar类的before,after方法的参数是Object类型的?

( 胜博发游戏官网 )

源码如下,当参数不是Calendar的实例时返回的是false,但请问这样的比较有意义吗?
我个人觉得参数类型是不是不妥?比如我拿Date类型去做比较,不抱任何错,但其实永远返回的都是false

public boolean before(Object when) {
    return when instanceof Calendar
        && compareTo((Calendar)when) < 0;
}

public boolean after(Object when) {
    return when instanceof Calendar
        && compareTo((Calendar)when) > 0;
}

//我认为这样比较合理
public boolean after(Canlendar when) {
    return compareTo(when) > 0;
}

所以比较Calendar直接用ComparaTo()就好啦

DateCalendar是公认的烂。
相同问题stackoverflow

I think there is no particular reason for that. java.util.Calendar has some design issues we have have to live with, unfortunately.


补充:
Java8实现了新的包java.time,值不可变,且线程安全,包里主要的类与格式

与旧API对应关系

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网这个程序问题在哪里?为什么好像陷入死循环?

( 胜博发游戏官网 )

客户端向服务发送数据。服务器收到数据后给客户端反馈。
可是程序运行之后并没有返回数据给客户端,而且程序也没有停下来。

class TcoClient{
    public static void main(String[] args) throws IOException {
       BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\abs.apk"));
       Socket socket = new Socket(InetAddress.getLocalHost(), 10000);
       OutputStream os = socket.getOutputStream();
       byte[] buf = new byte[1024];
       int len;
       while ((len = bis.read(buf)) != -1) {
           os.write(buf, 0, len);
       }
       InputStream is = socket.getInputStream();
       int backLen = is.read(buf);
       System.out.println(new String(buf, 0, backLen));
       os.close();
   }
}

class TcpServer {
   public static void main(String[] args) throws IOException {
       ServerSocket serverSocket = new ServerSocket(10000);
       Socket socket = serverSocket.accept();
       InputStream is = socket.getInputStream();
       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\cde.apk"));
       byte[] buf = new byte[1024*1024];
       int len;
       while ((len = is.read(buf)) != -1) {
           bos.write(buf, 0, len);
       }
       OutputStream os = socket.getOutputStream();
       os.write("文件传输完成".getBytes());
   }

不评论代码的其他问题,仅回答为什么你的代码看上去像是死循环:因为服务端一直再接收客户端传送来的数据,一直读到-1个字节(或者说EOF)才会跳出那个while循环,但是除非你close客户端的socket.close(), 服务端是不会收到EOF的,所以你的服务端代码一直在等待客户端传数据过来。否则不会发送传输完毕的回答。

与此同时,因为服务端代码不发送传输完毕的回答,客户端也在苦等服务端的响应,直到双方某一方超时(你没设置任何一端超时)。

改进方案:
我认为你这是希望通过这一个socket做双向通信,因此你需要设置一套自己的协议,比如先发4个字节过去,告诉服务端我这个文件的长度是多少,接下来服务端接收了这么多字节就表示文件接收完毕,返回响应消息。

除非你是想学习socket通信,否则为了实现文件传输,建议使用成熟的协议和方案,比如ftp或者http之类的。

另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服务端关闭了,它仍然可以连接成功?不抛connection refuse异常。。。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城内部类的构造问题

( sbf胜博发娱乐城 )

package test;

import test.A.B;

public class Test extends A.B.C {

    public Test(B b, String str) {
        b.super(str);
        //System.out.println(" * " + b);
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A.B b = new A("A1").new B("B2");
        Test test = new Test(b, "C3");
    }

}

class A {
    A(String str) {
        System.out.println(str);
    }
    class B {
        B(String str) {
            System.out.println(str);
        }
        class C {
            C(String str) {
                System.out.println(str);
            }
        }
    }
}

弄不懂,为什么Test中直接super不可以,而要使用B的实例b调用super()。
另外super()的结果为什么是构造了C呢?

从这个例子来看,你在Test中直接调用super构造是不可以的,因为C是B的一个非静态类,也就是说,要构造C,你必须提供一个B的实例,就像前一句 A.B b = new A("A1").new B("B2"); 一样,要构造B,必须使用A的实例,而不能直接 A.B b = new A.B("B2");。 而因为 Test 位于 B 之外,所有直接继承 A.B.C 是无法实现构造的,所以就有了这里例子中很巧妙办法,通过在构造函数中传递 B 的实例,将 Test 的构造交给实例 B 来完成,这样就可以实现构造了。

另外,这里 b.super() 的调用,并不是调用了 b 的父类的构造方法,而是任然是调用 Test 的父类的构造方法(也就是 C 的构造方法),所以结果就是构造了 C 。这个形式与常规类的继承构造略有不同,理解上要做区分。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网Calendar的add方法中的DAY_OF_MONTH参数和DAY_OF_YEAR参数有什么区别?

( 胜博发游戏官网 )

比如,

calendar.add(Calendar.DAY_OF_MONTH, amount);
calendar.add(Calendar.DAY_OF_YEAR, amount);

如上,有何区别?

简单来说,没区别。

Calendar 类的 add 方法是个抽象方法,在 JDK 中有三个类实现了这个方法,分别是:

  • java.util.JapaneseImperialCalendar

  • java.util.GregorianCalendar

  • sun.util.BuddhistCalendar

忽略第三个,只看前两个实现类,有这么一段代码:

case DAY_OF_MONTH: // synonym of DATE
case DAY_OF_YEAR:
case DAY_OF_WEEK:
    break;

粗看一下,break以后的执行分支并没有针对这三种做区别处理。
而且 amount 似乎没有受第一个参数的范围限制,比如调用:

calendar.add(Calendar.DAY_OF_MONTH, 100);

可以看到最终结果的 day_of_year 还是增长了100 天。

这个方法的 API 中描述的两个规则可以解释这种超过范围情况:

Add rule 1. The value of field after the call minus the value of field
before the call is amount, modulo any overflow that has occurred in
field. Overflow occurs when a field value exceeds its range and, as a
result, the next larger field is incremented or decremented and the
field value is adjusted back into its range.

Add rule 2. If a smaller field is expected to be invariant, but it is
impossible for it to be equal to its prior value because of changes in
its minimum or maximum after field is changed, then its value is
adjusted to be as close as possible to its expected value. A smaller
field represents a smaller unit of time. HOUR is a smaller field than
DAY_OF_MONTH. No adjustment is made to smaller fields that are not
expected to be invariant. The calendar system determines what fields
are expected to be invariant.

所以我觉得这两个方法调用没有区别,即便 amount 超出了 day_of_month 的范围,这个方法也会正确处理。
不过从可读性考虑,还是用适当的参数比较好。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网java后台如何获取前台FormData数据

( 胜博发游戏官网 )

servlet

@RequestMapping(value = "/json/uploadAvatar.json", method = RequestMethod.POST)
@ResponseBody
public String uploadAvatar(@RequestParam("croppedImage") MultipartFile file) {
try {
InputStream content = file.getInputStream();
String properties = "aliyun-oss.properties";
String filepath = userSitesService.uploadAvatar(properties, content);
} catch (Exception ex) {

    }
    return null;
}
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机Mac 下eclipse启动tomcat失败

( SBF胜博发娱乐老虎机 )

已经下载了tomcat7和tomcat8,并且Java环境已经配置, 默认localhost80端口可以启动并且看到阿帕奇的jsp界面。但是直接终端中将项目放到webAPP文件下不能正常打开项目。在eclipse中启动tomcat如图只说tomcat不能启动也没有任何提示。。

感谢各位的解答!!

最好看一下日志文件,在tomcat的log文件夹下面,
我遇到的最多的问题是端口绑定冲突,解决方法是在系统的进程浏览器中找一找有没有java进程,就是已经启动的tomcat 停掉,再使用eclipse 启动tomcat 服务。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网dom4j操作xml文件怎么在指定节点增加父节点?

( 胜博发游戏官网 )

<?xml version=”1.0″ encoding=”UTF-8″?>
<xml1>

<AFE.11 NAME='姓名'>王二</AFE.11>
<AFE.12 NAME='性别'>男</AFE.12>
<AFE.13 NAME='出生日期'>1985-05-05</AFE.13>
<AFE.14 NAME='民族编码'>01</AFE.14>
<AFE.15 NAME='民族'>汉</AFE.15>
<AFE.16 NAME='家庭住址'>帝都</AFE.16>
<AFE.17 NAME='联系电话'>18795487545</AFE.17>
<BAS.01 NAME='机构ID'>5100010001</BAS.01>
<BAS.02 NAME='住院号'>0000000001</BAS.02>
<BAS.03 NAME='手术编号'>01.0</BAS.03>
<BAS.05 NAME='手术名称'>颅穿刺术</BAS.05>
<BAS.09 NAME='手术日期'>2016-01-05</BAS.09>
<BAS.10 NAME='手术医生'>系大大</BAS.10>
<BAS.11 NAME='手术助理1'>小鹏</BAS.11>
<BAS.12 NAME='手术助理2'>小朋</BAS.12>
<BAS.13 NAME='手术助理3'>晓鹏</BAS.13>
<BAS.14 NAME='麻醉方式编码'>05</BAS.14>
<BAS.15 NAME='麻醉方式名称'>全身麻醉</BAS.15>
<BAX.028 NAME='入院科室名称'>内一科</BAX.028>
<BAX.030 NAME='入院床位名称'>005</BAX.030>
<BAX.031 NAME='入院时间'>2015-05-04</BAX.031>
<BAX.036 NAME='出院时间'>2016-01-18</BAX.036>

</xml1>
把上面这篇文件转换成下面这样的:
<?xml version=”1.0″ encoding=”UTF-8″?>
<xml>

<AFE id="0">
    <AFE.11 NAME='姓名'>王二</AFE.11>
    <AFE.12 NAME='性别'>男</AFE.12>
    <AFE.13 NAME='出生日期'>1985-05-05</AFE.13>
    <AFE.14 NAME='民族编码'>01</AFE.14>
    <AFE.15 NAME='民族'>汉</AFE.15>
    <AFE.16 NAME='家庭住址'>帝都</AFE.16>
    <AFE.17 NAME='联系电话'>18795487545</AFE.17>
</AFE>
<BAS id="d">
    <BAS.01 NAME='机构ID'>5100010001</BAS.01>
    <BAS.02 NAME='住院号'>0000000001</BAS.02>
    <BAS.03 NAME='手术编号'>01.0</BAS.03>
    <BAS.05 NAME='手术名称'>颅穿刺术</BAS.05>
    <BAS.09 NAME='手术日期'>2016-01-05</BAS.09>
    <BAS.10 NAME='手术医生'>系大大</BAS.10>
    <BAS.11 NAME='手术助理1'>小鹏</BAS.11>
    <BAS.12 NAME='手术助理2'>小朋</BAS.12>
    <BAS.13 NAME='手术助理3'>晓鹏</BAS.13>
    <BAS.14 NAME='麻醉方式编码'>05</BAS.14>
    <BAS.15 NAME='麻醉方式名称'>全身麻醉</BAS.15>
</BAS>
<BAX id="e">
    <BAX.028 NAME='入院科室名称'>内一科</BAX.028>
    <BAX.030 NAME='入院床位名称'>005</BAX.030>
    <BAX.031 NAME='入院时间'>2015-05-04</BAX.031>
    <BAX.036 NAME='出院时间'>2016-01-18</BAX.036>
</BAX>

</xml>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网关于java分布式应用开发除了dubbo还有什么框架可推荐吗

( 胜博发游戏官网 )

用java来开发分布式应用,除了dubbo框架,还有什么好的框架吗?

重磅推荐spring-cloud,其他的如twitter的finagle,facebook的thrift

  • JINI

  • CORBA

  • ICE

dobbox,当当网对dobbo做二次开发的,现在dobbo已经不在更新维护了

还有 hprose,它是唯一一个无侵入式的跨语言跨平台的分布式 RPC,同时支持服务器到客户端的推送。性能比 dubbo 要高很多。

该答案已被忽略,原因:

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网MultiThreadedHttpConnectionManager在哪个jar包里啊?

( 胜博发游戏官网 )

如题,我已经导入如下图,可还是不能用MultiThreadedHttpConnectionManager类呢?

搜了一下,httpclient版本不对,用3.x
4.X应该没有这个了

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网com.sun.java.accessibility.util包不存在

( 胜博发游戏官网 )

使用GUIInitializedListener
在com.sun.java.accessibility.util中但是调用提示不存在
The import com.sun.java.accessibility cannot be resolved
在网上查看com.sun.java.accessibility.util在jaccess.jar中。但是我的JDK 1.7-65中没有这个包,如何解决这个问题?

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机java 中多个内部类嵌套,如何继承

( SBF胜博发娱乐老虎机 )

class A 
{
    A(String str)
    {
        System.out.println("A");
    }
    
    class B
    {
        B(String str)
        {
            System.out.println("B");
        }
        
        class C
        {
            C(String str)
            {
                System.out.println("C");
            }
        }
    }
}


public class Test extends A.B.C
{
     /*问题这里构造函数应该如何编写呢*/
     Test() 
     {
     }
}

String in = "TestStr";
A.B.C out = new A(in).new B(in).new C(in);

输出:
A
B
C

和C的保持一致

/**
 * 
 */
package test;

import test.A.B;

/**
 * @author yinwoods
 * 2015年12月29日
 */
public class Test extends A.B.C {

    /**
     * @param b
     * @param str
     */
    public Test(B b, String str) {
        b.super(str);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A.B b = new A("A1").new B("B2");
        Test test = new Test(b, "C3");
    }

}

class A {
    A(String str) {
        System.out.println(str);
    }
    class B {
        B(String str) {
            System.out.println(str);
        }
        class C {
            C(String str) {
                System.out.println(str);
            }
        }
    }
}

A1
B2
C3

打印结果为:

这样做是对的,但具体原因我也没弄懂。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机java平时说的api指的是“api文档”还是自己编写的“类、接口”?还是单纯就是“接口”不包括类?

( SBF胜博发娱乐老虎机 )

java平时说的api指的是“api文档”还是自己编写的“类、接口”?还是单纯就是“接口”不包括类?

API一般指程序对外的接口,供他人使用时的方法和字段定义

Application Programming Interface – 应用程序编程接口
java平时说的API是指api的描述文档。

我觉得更多的是指“方法”。
但是广义的讲也包括类、接口等的定义。
比如《Java API Docs》包括所有公开的接口、类、枚举、常量、方法的说明。

API字面意思就是应用程序编程接口
一般指的意思是契约
API文档是对契约的描述,而类是契约的实现

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城Java 8的Lambda表达式为什么要基于invokedynamic?

( sbf胜博发娱乐城 )

基于invokedynamic相对于匿名内部类有什么优势呢?

搜一搜一大堆回答,来看看知乎的回答吧:http://www.zhihu.com/question/39462935

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网maven管理多模块, 其中一个模块注入有问题?

( 胜博发游戏官网 )

项目结构如图:

logic模块, 该模块负责具体的业务逻辑(分为service层, dao层)

    beans.xml 定义在这里
    

server模块, 负责具体的客户端的接入(用的netty)

    这里的main方法负责启动spring
    

现在出现一个诡异的地方, server中的一个类ConnectHandler, 该类中的成员对象UserLoginService上@AutoWire, 都没有成功, 也不报错, 只是运行的时候会有空指针异常

其次,我在server模块中的main方法中, 通过spring的getBean方法, 得到 ConnectHandler, 成功, 调用getUserLoginService(), 成功, 为什么这里都不为空,

  1. 综上, 基本可以排除, 什么忘记注解, 没有扫描到server模块啊,之类的错误

以下是beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.2.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
       ">

    <context:component-scan base-package="com.haoyin.*"/>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql:///localtest" />
        <property name="user" value="root" />
        <property name="password" value="" />
        <property name="initialPoolSize" value="3" />
        <property name="minPoolSize" value="3" />
        <property name="maxPoolSize" value="10" />
        <property name="maxIdleTime" value="5" />
    </bean>


    <!-- myBatis 配置    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:com/haoyin/logic/dao/*.xml"/>
    </bean>

    <!-- mybatis自动实现dao-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.haoyin.logic.dao"/>
    </bean>

    <!-- 配置sqlSessionTemplate
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>
    -->

    <!-- 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven transaction-manager="txManager" />

</beans>

以下是ConnectHandler类:

package com.haoyin.server.handler;


import com.haoyin.logic.service.UserLoginService;
import com.haoyin.server.exception.connect.ConnectMessageException;
import com.haoyin.server.exception.connect.ConnectionAlreadyExistException;
import com.haoyin.server.exception.connect.MessageFormatException;
import com.haoyin.server.exception.connect.UserPermissionException;
import com.haoyin.server.state.Connection;
import com.haoyin.server.state.ConnectionManager;
import com.haoyin.server.state.UserConfig;
import com.haoyin.server.utils.StringUtils;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.mqtt.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.net.InetSocketAddress;

/**
 * Created by dong on 2016/1/12.
 */

@Service("connectHandler")
public class ConnectHandler extends SimpleChannelInboundHandler<MqttMessage> {

    private Logger logger = LoggerFactory.getLogger(ConnectHandler.class);

    @Autowired
    private TestHandler handler;
    @Autowired
    private UserLoginService userLoginService;
    private ChannelHandlerContext ctx;


    public void setUserLoginService(UserLoginService userLoginService) {
        this.userLoginService = userLoginService;
    }
    
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        this.ctx = ctx;
        System.out.println("active");
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MqttMessage msg) throws Exception {
        if (msg.fixedHeader().messageType() == MqttMessageType.CONNECT) {
                doConnect(ctx, (MqttConnectMessage) msg);
                sendResponse(buildSuccessAck());
        } else if (msg.fixedHeader().messageType() == MqttMessageType.DISCONNECT) {

        } else {
            //想绕过建立连接
            ctx.fireChannelRead(msg);
        }
    }
    /**
     *
     *
     *  @throws ConnectionAlreadyExistException
     *  @throws UserPermissionException
     *  @throws MessageFormatException
     *
     * */
    private void doConnect(ChannelHandlerContext ctx, MqttConnectMessage connectMessage) {
        checkMessageFormat(connectMessage);

        MqttConnectVariableHeader variableHeader = connectMessage.variableHeader();
        MqttConnectPayload payload = connectMessage.payload();

        //1. 验证用户合法
        String uid = payload.userName();    //约定, username为uid
        String token = payload.password();  //约定, password为token
        checkUserAuth(uid, token);

        String clientId = payload.clientIdentifier();
        checkConnectionExist(clientId);   // 2. 确保用户唯一

        UserConfig userConfig = extractUserConfig(variableHeader, payload);
        buildAndInitConnection(userConfig);
    }


    private void checkMessageFormat(MqttConnectMessage connectMessage)
            throws MessageFormatException {
        MqttConnectPayload payload = connectMessage.payload();

        String clientId = payload.clientIdentifier();
        if (!StringUtils.checkLength(clientId, 1, 23)){
            throw new MessageFormatException(
                    "clientId长度不合法!",
                    MqttConnectReturnCode.CONNECTION_REFUSED_IDENTIFIER_REJECTED);
        }
    }

    private void checkUserAuth(String uid, String token) {
        boolean ok = userLoginService.authenticate(uid, token);
        if (ok) return;
        throw new UserPermissionException("用户验证不通过",
                                        MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD);
}

    private void checkConnectionExist(String clientId) {
        //约定clientId为userId

    }

    /**
     *  保存用户配置, 是否需要遗嘱, clean Session
     *  这些配置在Connect报文的 可选头部和载荷中
     *
     * */
    private UserConfig extractUserConfig(MqttConnectVariableHeader variableHeader,
                                         MqttConnectPayload payload){
        String uid = payload.userName();
        boolean cleanSession = variableHeader.isCleanSession();
        int keepAliveTime = variableHeader.keepAliveTimeSeconds();
        UserConfig profile = new UserConfig(uid, cleanSession, keepAliveTime);
        return profile;
    }

    private void buildAndInitConnection(UserConfig userConfig) {
        Connection connection = ConnectionManager.INSTANCE.create(ctx);
        connection.setUserConfig(userConfig);
    }



    private MqttConnAckMessage buildSuccessAck(){
        MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.CONNACK, false,
                MqttQoS.EXACTLY_ONCE, false, 0);
        MqttConnAckVariableHeader variableHeader = new MqttConnAckVariableHeader(
                MqttConnectReturnCode.CONNECTION_ACCEPTED, false);
        MqttConnAckMessage ack = new MqttConnAckMessage(fixedHeader, variableHeader);
        return ack;
    }


    private String getClientIP(){
        InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
        String clientIP = address.getAddress().getHostAddress();
        return clientIP;
    }


    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        if (cause instanceof MessageFormatException) {
            handleProtocolFormatError((MessageFormatException) cause);
        } else if (cause instanceof ConnectionAlreadyExistException) {
            handleConnectionAlreadyExist((ConnectionAlreadyExistException) cause);
        } else if (cause instanceof UserPermissionException) {
            handleUserPermission((UserPermissionException) cause);
        } else {
            ctx.fireExceptionCaught(cause);
        }
    }

    private void handleProtocolFormatError(MessageFormatException e) {
        if (logger.isDebugEnabled()) {
            logger.info("ProtocolFormatError");
        }
        sendResponse(buildErrorAck(e));
    }

    private void handleConnectionAlreadyExist(ConnectionAlreadyExistException e) {
        if (logger.isDebugEnabled()) {
            logger.info("ConnectionAlreadyExist");
        }
        sendResponse(buildErrorAck(e));
    }

    private void handleUserPermission(UserPermissionException e) {
        if (logger.isDebugEnabled()) {
            logger.info("UserPermission");
        }
        sendResponse(buildErrorAck(e));
    }


    private MqttConnAckMessage buildErrorAck(ConnectMessageException e){
        MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.CONNACK, false,
                MqttQoS.EXACTLY_ONCE, false, 0);
        MqttConnAckVariableHeader variableHeader = new MqttConnAckVariableHeader(
                e.getMqttConnectReturnCode(), false);
        MqttConnAckMessage ack = new MqttConnAckMessage(fixedHeader, variableHeader);
        return ack;
    }

    private void sendResponse(MqttMessage mqttMessage) {
        ctx.writeAndFlush(mqttMessage);
    }


}

请各位帮忙看看, 困在这里一天了..

确定空指针是由UserLoginService造成的?

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城如何获取其他电脑上的图片路径

( sbf胜博发娱乐城 )

有两台电脑上有Apache,上传照片时存储到A电脑,当访问时,可能由于压力等原因,在D电脑上访问上传的图片,这个要怎么写img才能显示照片

首先要打通两台服务器的文件系统,然后使用文件系统的结构访问就好了。
简单点的可以通过Sync在A和B之间同步目录,在B服务器安装http server直接请求文件地址下载。

TAG:NFS

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网如何用多个线程顺序读取缓存队列?

( 胜博发游戏官网 )

我定义了一个数据缓存(ArrayBlockQueue),用多个线程去读取缓存,并将数据写入到数据库中。
现在的问题是这样的:由于缓存中存放的是用户的行为数据,所以入库的时候每个用户各自的数据需要严格按照时间来入库,但多线程下是无法保证这种顺序性的。

思考了一下,想用这种方式来做:队列中不同用户的数据不需要考虑顺序,两个线程随意读取;但一个用户的数据只能由某个特定线程去读取,这样数据进入队列时的时序性就能够保证入库的时序性了。

有没有比较简单的方法来实现呢?

这其实是一个生产/消费模型中的一个问题: 顺序消费的问题.(假定生产者已将数据按照顺序放入队列)

最开始能想到的方法:
单线程消费, 这样就严格保证了顺序.

但带来的问题是消费速度慢, 特别是这种插入关系型数据库(耗IO)的行为, 这样就会导致队列全满, 从而有可能影响到生产者, 或者是丢失数据, 消耗内存.

可以从两个方面解决:

  • 仍然保持单线程消费, 而提高后端的消费速度, 从题主的case看, 记录的只是用户的行为日志, 很多时候, 日志只需要进行append即可, 即顺序写磁盘, 或者写类似于HBaseLSM tree的数据库.(当然也会带来查询上的问题).

  • 单线程换成多线程, 题注的case中,只关注单个用户的顺序性, 所以可以对用户进行分区(比如简单的hash).
    可以对队列进行分区, 也可以对消费线程进行分区, 从而达到并行的效果.

另外, 从题主的描述来看, 我猜想可能是个 web 应用, 并且使用了内存队列作为操作日志的缓存, 再通过异步线程去写入这些日志.

这里需要注意的是, 如果你的部署结果是 N台web + 前端负载, 那么还需要注意前端负载对用户的路由策略, 如果全局的用户操作日志已经没有顺序了, 那么单机再怎么严格顺序, 也没有意义.

用户的行为时间可以存到db字段里,db可以帮你按这个字段排序啊

既然你的用户数据可以分开,那不同的用户数据使用不同的缓存就好了,实现起来最简单。
如果你需要更高的缓存使用率和并行率,那可以在用户的数据中加入用户ID和顺序编号(通过统一的方法生成或直接使用时间戳),就既可以使用多线程处理同一个用户的数据,也可以保证某一个用户的入库顺序了。

用户ID进行hash到不同的线程就是了。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机.net,java,php这些服务器端的进程是如何获取web客户端传递的参数的?

( SBF胜博发娱乐老虎机 )

首先谈下我对这个过程的模糊认识:
1.Web客户单向Web服务器发起请求
2.Web服务器启动一个CGI进程,CGI进程从打开的文件描述符中读取请求数据
3.问题:
a.CGI进程如何将请求参数传递给.net,java,php这些进程?
b.net,java,php这些进程是一直运行的吗?
c.一个简单的HTTP请求至少要涉及到3个进程间的通信?

a、通过环境变量和STDIN传递信息
b、CGI进程有几种运行方式,普通的CGI是不一直运行的,每次请求都会创建一个CGI进程,但是这种方式会导致CGI进程的频繁创建和销毁浪费性能,所以就有了FAST-CGI,CGI进程会在一个进程池里呆着,每当有请求就会唤醒一个进程去处理,处理完成就回到进程池
c、以lnmp为例,请求首先送给Nginx,然后由nginx交给php-fpm,php-fpm是PHP的FAST-CGI管理器,收到nginx发来的请求后再传递给php-cgi,处理完成再传递回去,于是就有三个进程参与此次请求的处理

既然是web客户端的就大致说下走http的数据把:
题主可以先看看http文件格式,我们的GET、POST、COOKIE这些数据都是包装在http信息里面的纯文本,
到server端,收到这些http数据的软件会对这些纯文本进行解析,就这样

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城jax-rs,jax-ws这些J2EE标准是否有学习的必要?

( sbf胜博发娱乐城 )

最近在写webservice,然后参考了axis2、cxf这些框架,但是感觉很复杂,而且自己通过servlet3.1+json构建webservice本身很方便,那么设计这些标准和框架的初衷是什么?而且有无必要去深入学习?

jax-rs、jax-ws这些只是J2EE规范的一部分,也就是说它是一个标准接口。使用这个原生标准当然可以开发,但是在和其他框架集成时比较麻烦。
axis2、cxf这些是jax-rs、jax-ws这些标准的不同实现,他们提供了在这些标准之上更强大的功能,但都遵循这些标准。并且他们能与JAVA的其他框架更容易集成。就像JPA也是一个标准接口,而各ORM框架也是它的实现一样。
我个人认为当然应该先弄清这些接口,毕竟它是更原生的东西,axis2、cxf这些框架也是实现了它。对于axis2、cxf这些框架,要了解它的思想及原理。至于使用如果没有需要,没必要太深究。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…