开发者社区> 问答> 正文

socket服务端报java.lang.NullPointerException?400报错

socket服务端报java.lang.NullPointerException异常? 400 报错 我这个socket服务端主要用于接收浏览器的http请求参数,在浏览器输入
http://127.0.0.1:9999/printLabel?userName=中国人&orderNo=1354&areaNo=2 回车后socket服务端能拿到想要的参数。但是等一会之后就会抛出以下异常停止运行了。这是怎么回事?
userName=中国人,orderNo=1354,areaNo=2 

Exception in thread "main" java.lang.NullPointerException         
         at java.net.URLDecoder.decode(URLDecoder.java:119)         
         at com.gougoujp.www.ws.server.main(server.java:25)

socket服务端代码如下:
public class server {        public static void main(String[] args) throws Exception {               
ServerSocket ss = new ServerSocket(9999);                
// 等待客户端请求               
while (true) {                        
Socket s = null;                       
// 接受客户端请求                   
     s = ss.accept();                        
//System.out.println("---success.....");                       
// 获取客户端发送过来的数据                       
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));                        
String data = in.readLine();                       
try {                                
data = URLDecoder.decode(data, "UTF-8");                       
} catch (UnsupportedEncodingException e) {                              
  e.printStackTrace();                       
}                      
  // System.out.println("客户端传过来的数据为:" + data);                      
  if (data.startsWith("GET")) {                               
String a = data.split("HTTP")[0];                                
String sid = a.split("\?")[1];                                
String[] sts = sid.split("&");                                
String userName = sts[0].split("=")[1];                                
String orderNo = sts[1].split("=")[1];                                
String areaNo = sts[2].split("=")[1];
                                
System.out.println("userName=" + userName + "," + "orderNo="                                               
+ orderNo + "," + "areaNo=" + areaNo);                        
}                                              
  // 关闭socket                      
  s.close();                
    }
}

展开
收起
爱吃鱼的程序员 2020-06-03 17:08:35 916 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    浏览器断开了网络连接吧!######

    引用来自“天道无为”的答案

    浏览器断开了网络连接吧!
    没有啊,就是访问那个网址,没做过什么。socket服务端自动报错断开的。
    ###### 你把   s = ss.accept();         这里的s打印出来看看,看它出错前最后一次是什么?######

    引用来自“天道无为”的答案

    你把   s = ss.accept();         这里的s打印出来看看,看它出错前最后一次是什么?

    输入网址回车后先出来这三行:

    s=Socket[addr=/127.0.0.1,port=63669,localport=9999]

    userName=中国人,orderNo=1354,areaNo=2 

    s=Socket[addr=/127.0.0.1,port=63670,localport=9999]

    然后就还是一样的报错。

    ######这应该是浏览器的原因,因为很明显浏览器建立了两次连接,但是第二次连接没有发送数据,这从打印的两个socket就能看出来。因为我对浏览器的底层不是特别熟悉,所以手工写了一个socket客户端进行测试,证明了一下这个猜测,至于原理我也不是很清楚。######应该是浏览器关闭了socket连接,这是有可能的,和它的实现方式有关。但有一点,你这个 String data = in.readLine(); 的data怎么可以不做空值校验呢!非常严重的代码质量问题,你用findbug扫一下,它都会给你红X的。######

    引用来自“天道无为”的答案

    你把   s = ss.accept();         这里的s打印出来看看,看它出错前最后一次是什么?
    好像是浏览器建立两次连接,为什么会这样?怎么解决?能说一下吗?
    ###### @天道无为 空值校验做了,但是http不断开,卡死在那里,如果强行停止就会报空指针异常。如果不停止的话再打开网页访问就访问不到。######不用理,做个空值校验就好了,应该是http短连接问题,每完成一次报文收发就断开了连接,下次再发时会创新新的连接。######大哥,我也遇到这个问题,搞了一两天, 前辈给我提供了思路,感觉是这个问题:http1.1之后默认使用长连接keep alive,在http请求里的connection头信息那里,防止socket中断。感觉可能是这个问题。可以尝试着解决下。
    2020-06-03 20:35:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载