java.net连接浏览器,浏览器与Socket的简单交互(原创禁止转载)

感谢博文: Socket编程之实现浏览器与Socket的交互

本文禁止转载

------------------------------------------------------本文只需以下三步---------------------------------------------------------

只需一个Java类即可

package com.xiaojia.client_PC;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import javax.imageio.stream.FileImageInputStream;

import com.alibaba.fastjson.JSON;

public class Server_PC {

	public static void main(String[] args) throws Exception {
		ServerSocket server =  new ServerSocket(8888);
		while(true){
			Socket socket = server.accept();
			InputStream is = socket.getInputStream();
			
			String methodLine = readLine(is, 0);//取得请求方式行
			System.out.println(methodLine);//头信息第一行
			String method = new StringTokenizer(methodLine).nextElement().toString();//取得请求方法
			String lu_jin = null;//请求到路径
			String params_line = null;//参数行,get和post取参方式不一样,get在url里面取就行,post在读完头信息后,在消息体里面取
			if("POST".equals(method)){
				String lineStr;
				int content_length = 0;//post传入到参数行字节码个数
				do{
					lineStr = readLine(is, 0);//取得行字符串信息
					if(lineStr.indexOf("Content-Length") != -1){
						content_length = Integer.parseInt(lineStr.split(":")[1].trim());
					}
				}while(!lineStr.equals("\r\n"));//将头文件读完
				params_line = readLine(is, content_length);//读完头文件后,再读取post传过来到消息体
				lu_jin = methodLine.split(" ")[1];//即取得“http://127.0.0.1:8888/路径” 中的  “/路径” 
			}else if("GET".equals(method)){
				int index = methodLine.indexOf("?");
				params_line = methodLine.split(" ")[1];//即取得“http://127.0.0.1:8888/路径?参数” 中的“/路径?参数”
				if(index != -1){//如果带参情况
					lu_jin = params_line.substring(0,index);
					params_line = params_line.substring(index+1);
				}else{
					lu_jin = params_line;
				}
			}
			System.out.println("lu_jin:---"+lu_jin);
			System.out.println("params_line:---"+params_line);
			
			/*
			//用二进制流将数据输出到浏览器,可用于文件、页面显示等
			PrintStream ps = new PrintStream(socket.getOutputStream());
			ps.println("HTTP/1.1 200 OK");//头信息
			ps.println("Accept-ranges:bytes");//头信息,接受范围
			ps.println("Content-Type:*");//头信息
			ps.println("Access-Control-Allow-Origin:*");//头信息,跨越
			ps.println();//告诉浏览器头信息结束,下面开始输出二进制流
			
            File file = new File("C:\\Users\\Administrator\\桌面\\t0122662127e2518bcb.jpg");
            InputStream input = new FileInputStream(file);
			byte[] b = new byte[(int) file.length()];
			input.read(b);
			//ps.write(b);//向浏览器输出二进制流,在浏览器访问http://127.0.0.1:8888
			ps.write("请求成功".getBytes());//向浏览器输出二进制流,在浏览器访问http://127.0.0.1:8888
			ps.close();
			is.close();
			socket.close();
			*/
			
			//向浏览器输入文本
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			pw.println("HTTP/1.1 200 OK");//头信息
			pw.println("Content-Type:*");//头信息,接受范围,如果返回json数据必须是Content-Type:appllication/json
			pw.println("Access-Control-Allow-Origin:*");//头信息,跨越
			pw.println();//告诉浏览器头信息结束,下面开始输出文本
			/*
            pw.println("你好!");
            pw.println("你成功了吗");
            pw.println("到底成功了没有");//向浏览器输出文本,在浏览器访问http://127.0.0.1:8888
            */
			Map map = new HashMap();
			map.put("a", "123");
			map.put("b", "456");
			map.put("c", "789");
            pw.println(JSON.toJSONString(map));//向浏览器输出二进制流,用ajax请求http://127.0.0.1:8888,返回json数据,头信息必须是Content-Type:appllication/json
            pw.close();
			is.close();
			socket.close();
			
		}
		

	}
	
	public static String readLine(InputStream is, int total) throws Exception{
		ArrayList lineByteList = new ArrayList();
		byte bt;
		int index = 0;
		if(total == 0){
			do{
				bt = (byte) is.read();
				lineByteList.add(bt);
			}while(bt != 10 && bt != -1);
		}else{
			do{
				bt = (byte) is.read();
				lineByteList.add(bt);
				total --;
			}while(total > 0);
			
		}
		byte[] lineByteArr = new byte[lineByteList.size()];
		for(int i=0;i < lineByteArr.length; i++){
			lineByteArr[i] = (byte) lineByteList.get(i);
		}
		lineByteList.clear();
		String str = new String(lineByteArr,"GBK");
		if (str.startsWith("Referer")) {//如果有Referer头时,使用UTF-8编码   
			str = new String(lineByteArr, "UTF-8");   
		}   
		return str;
	}
}

--------------------------------------------------浏览器直接输入网址访问----------------------------------------------------

打开浏览器访问  http://127.0.0.1:8888,效果怎么样我就不拿上来了,我的博客都是自己用过测试过的东西。

你可能感兴趣的:(JavaWeb,Java,Java.net)