C/S 与 B/S
☆ C/S ( Client/Server ) 客户端和服务端的特点
1、客户端和服务端的软件都需要程序员进行编写。
2、客户端维护起来较为麻烦。
3、客户端的存在可以将一部分运算分离到客户端来运行,减轻了服务器端的压力。
☆ B/S ( Browse/Server ) 浏览器和服务端的特点
1、客户端不用程序员编写,直接使用系统中具备的浏览器软件作为客户端即可。程序员只需要编写服务器端就OK了。
2、维护起来也很容易,因为只要维护服务器即可。
3、所有的运算都在服务器端,相对压力较大。
练习:(了解B/S模式的底层socket通讯原理)
1、自定义一个服务器,接收浏览器发来的信息。显示浏览器发送了什么信息,并向浏览器发送简单的网页信息。
package cn.hncu.bs; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) { try { ServerSocket server=new ServerSocket(80);//为了方便他人访问,这里设成默认端口号 while (true) { Socket socket=server.accept(); System.out.println(socket.getInetAddress().getHostAddress()+"...has connected"); new Thread(new ClientThread(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ClientThread implements Runnable{ private Socket socket=null; public ClientThread(Socket socket) { this.socket = socket; } @Override public void run() { try { InputStream in=socket.getInputStream(); byte buf[]=new byte[1024]; int len1=in.read(buf); System.out.println(new String(buf,0,len1)); PrintWriter pw=new PrintWriter(socket.getOutputStream(),true); BufferedReader br=new BufferedReader(new InputStreamReader( new FileInputStream("d:\\html\\resume.html") )); //上面用IO读取的是我自己写的网页,你们写的时候也可以挂网页上去,或者直接在程序里面输出信息也行 String line=null; while ((line=br.readLine())!=null){ pw.write(line); } pw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }如果是外网访问这个模拟服务器只需要在浏览器上输入你的电脑的外网IP地址即可,但如果是内网,则输入内网的IP地址。 如果你装了路由器,那么请把网线从路由器上拔下来直接插在你的电脑上,因为路由器使得你的网络成了内网,外界无法访问一个内网。
2、模拟一个浏览器客户端向服务器发请求,接收并显示响应消息。
package cn.hncu.bs; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class MyBrowse { public static void main(String[] args) { try { Socket s = new Socket("www.hncu.net",80); //向服务器发送http协议请求头,以让服务器认识我们,给我们正确地响应 PrintWriter out = new PrintWriter(s.getOutputStream(),true); out.println("GET / HTTP/1.1");//请求行包含: 请求方式(GET POST) 空格 请求的资源路径 空格 http的协议版本 out.println("Accept: text/html, application/xhtml+xml, */*");//下面这些key-value是请求头 out.println("Host: www.hncu.net"); //out.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"); //out.println("Accept-Encoding: gzip, deflate"); out.println("Connection: close"); out.println();//空行---http协议请求头结束之后,必须要一个空行 System.out.println("请求完毕!"); //接收服务器的响应 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len=0; while( (len=in.read(buf))!=-1){ String str = new String(buf,0,len); System.out.println(str); } s.close(); } catch (Exception e) { e.printStackTrace(); } } } /* Http响应协议 HTTP/1.1 200 OK //应答行 包含: http协议版本 空格 响应消息号 消息描述 Date: Tue, 10 May 2016 09:15:00 GMT //下面这些key-value是响应消息头 Server: VWebServer X-Frame-Options: SAMEORIGIN Last-Modified: Tue, 10 May 2016 08:22:39 GMT ETag: "5a86-53278a0cff1c0" Accept-Ranges: bytes Content-Length: 23174 Vary: User-Agent,Accept-Encoding Cache-Control: private, max-age=600 Expires: Tue, 10 May 2016 09:25:00 GMT Connection: close Content-Type: text/html Content-Language: zh-CN //响应消息头结束处,必须有一个空行 响应正文(通常是html代码) */
3、网络蜘蛛,收集网页中的邮箱地址信息。
package cn.hncu.bs; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Test; public class SpiderDemo { @Test public void hello() throws IOException{ BufferedReader br = new BufferedReader(new FileReader("./net/mail.html")); //正则表达式 String regex= "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex); String line=null; while( (line=br.readLine())!=null){ Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group()); } } } public static void main(String[] args) { try { URL url = new URL("http://www.sina.com"); BufferedReader br= new BufferedReader( new InputStreamReader(url.openStream())); //正则表达式 String regex= "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex); String line=null; while( (line=br.readLine())!=null){ Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group()); } } } catch (IOException e) { e.printStackTrace(); } } }