为什么socket一直接收浏览器请求

silencewen 发布于 2013/09/26 13:59
阅读 1K+
收藏 0

阿里云2020上云采购季,爆款产品,低至0.6折,点击抢购!>>>

socket服务端代码如下:为什么我用浏览器访问http://127.0.0.1:9999/printLabel?userName=中国人&orderNo=1354&areaNo=2时,控制台一直不停地打印    userName=中国人,orderNo=1354,areaNo=2

怎么让它只打印一次,然后关闭当前连接,等待下次请求。

本人是菜鸟,或者有没人帮忙修改或者写一下socket怎么获取http请求参数的服务端。请求一次就获取一次的。感激不尽。。。

public class server {

    private static String userName; 
    private static String orderNo; 
    private static String areaNo; 
    public static void main(String[] args) throws Exception { 
    ServerSocket server = new ServerSocket(9999); 

     while (true) { 
            Socket socket = server.accept(); 
            System.out.println(socket); 
            invoke(socket); 
        } 
    } 


    private static void invoke(final Socket client) throws IOException { 
        new Thread(new Runnable() { 
        public void run() { 
        BufferedReader in = null; 
        try { 
            in = new BufferedReader(new InputStreamReader( 
            client.getInputStream())); 
            while (true) { 
                String data = in.readLine(); 
                while (data != null) { 
                    try { 
                        data = URLDecoder.decode(data, "UTF-8"); 
                        } catch (UnsupportedEncodingException e) { 
                        e.printStackTrace(); 
                        } 
                    if (data.startsWith("GET")) { 
                        String a = data.split(" ")[1]; 
                        String sid = a.split("\\?")[1]; 
                        String[] sts = sid.split("&"); 
                        userName = sts[0].split("=")[1]; 
                        orderNo = sts[1].split("=")[1]; 
                        areaNo = sts[2].split("=")[1]; 
                } 
                 System.out.println("userName=" + userName + "," + "orderNo=" + orderNo + "," + "areaNo=" + areaNo); 

             } 
        } 
            } catch (IOException ex) { 
            ex.printStackTrace(); 
            } finally { 
                try { 
                in.close(); 
                } catch (Exception e) { 
            } 
                try { 
                client.close(); 
                } catch (Exception e) { 
                } 
            } 
        } 
            }).start(); 
            } 
     } 

加载中
0
魔君
魔君
先把代码格式化一下,这么贴出来,鬼愿意看
0
silencewen
silencewen

引用来自“魔君”的答案

先把代码格式化一下,这么贴出来,鬼愿意看
搞定了,可以帮我看看吗?谢谢!
silencewen
silencewen
回复 @魔君 : 去掉while(true)以后还是一样循环打印
魔君
魔君
server 里面的while不要修改,改了就不监听了
魔君
魔君
invoke 里面的 while (true) 就是循环打印啊
0
guor
guor

改造一下while循环的条件就好了,做一个标志,部分代码如下:

public static void main(String[] args) throws Exception {
	ServerSocket server = new ServerSocket(9999);

	boolean flag = true;
	while (flag) {
		Socket socket = server.accept();
		System.out.println(socket);
		flag = invoke(socket);
	}
}

private static boolean invoke(final Socket client) {
	//这里可以跑你的线程,打印一些信息,代码略
	return false;
}

0
我不说话
我不说话
你这是要干嘛?浏览器发送了请求,你还要回复才行。你不回复,浏览器怎么确认你收到了请求,所以才会不停地发送请求…………
0
Monkey
Monkey
while (data != null)死循环
0
你要爪子
你要爪子
本身写了个死循环嘛。。。
0
silencewen
silencewen

引用来自“郭銳”的答案

改造一下while循环的条件就好了,做一个标志,部分代码如下:

public static void main(String[] args) throws Exception {
	ServerSocket server = new ServerSocket(9999);

	boolean flag = true;
	while (flag) {
		Socket socket = server.accept();
		System.out.println(socket);
		flag = invoke(socket);
	}
}

private static boolean invoke(final Socket client) {
	//这里可以跑你的线程,打印一些信息,代码略
	return false;
}

修改了之后一样不行。。。
0
silencewen
silencewen

引用来自“Monkey”的答案

while (data != null)死循环
注释掉这个以后也会打印好几个,而且还会报空指针异常。
0
Monkey
Monkey

引用来自“安卓菜鸟1号”的答案

引用来自“Monkey”的答案

while (data != null)死循环
注释掉这个以后也会打印好几个,而且还会报空指针异常。
web浏览器会发好几行数据过来,你那个readline就调用好几次,最后空指针是浏览器超时。你可以一行一行打印出来,url信息,cookie信息啊,编码信息,浏览器信息等。这些会分成好几行发送。
0
我不说话
我不说话

我之前说的貌似不对,仔细看了一下,下面代码是死循环,不一直打印,才怪呢

 while (true) { 

                String data = in.readLine(); 

                while (data != null) { 


 while (true) { 去掉

返回顶部
顶部