网络编程(4)B/S

C/S B/S

☆ C/S ( Client/Server ) 客户端和服务端的特点

1、客户端和服务端的软件都需要程序员进行编写。

2、客户端维护起来较为麻烦。

3、客户端的存在可以将一部分运算分离到客户端来运行,减轻了服务器端的压力。

☆ B/S ( Browse/Server ) 浏览器和服务端的特点

1、客户端不用程序员编写,直接使用系统中具备的浏览器软件作为客户端即可。程序员只需要编写服务器端就OK了。

2、维护起来也很容易,因为只要维护服务器即可。

3、所有的运算都在服务器端,相对压力较大。

网络编程(4)B/S_第1张图片

编程练习

(了解B/S模式的底层socket通讯原理)

1、自定义一个服务器,接收浏览器发来的信息。显示浏览器发送了什么信息,并向浏览器发送简单的网页信息。

Myserver类

package cn.huncu.net.bs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer {
	public static void main(String[] args) {
		try {
			ServerSocket ss=new ServerSocket(80);
			while (true) {
				Socket s = ss.accept();
				System.out.println(s.getInetAddress().getHostAddress()+"已连接........");
				new Thread(new ThreadDemo(s)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
class ThreadDemo implements Runnable{
	private Socket s=null;
	public ThreadDemo(Socket s) {
	this.s=s;
	}

	@Override
	public void run() {
		try {
			InputStream in = s.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					in, "gbk"));
//			String str = null;
//			while ((str = br.readLine()) != null) {
//				System.out.println(str);
//			}
			char cbuf[]=new char[1024];
			int len=br.read(cbuf);
			System.out.println(new String(cbuf, 0, len));
			OutputStream out = s.getOutputStream();
			PrintStream ps = new PrintStream(out, true);
			
			ps.println("");
			ps.println("欢迎光临....
"); ps.println("这是我用Java程序给你发的网页,比较简单,请多包涵..."); ps.println(""); ps.println(""); ps.println(""); ps.println("
Jack 25
Tom 24
"); ps.println(""); s.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }


 

2、模拟一个浏览器客户端向服务器发请求,接收并显示响应消息。

MyBrowse类

package cn.hncu.net.bs;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyBrowse {

	public static void main(String[] args) throws IOException {
		Socket s = new Socket("www.hncu.net", 80);
		PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "gbk"),true);
		
		//模拟浏览器向服务器发送请求
		//要按http协议的格式向服务器发消息,否则网站服务器不会应答
		out.println("GET / HTTP/1.1");//请求头
		out.println("Accept: text/html,application/xhtml,*/*");
		out.println("Host: www.hncu.net");
		out.println("Connection: keep-alive");
		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);
		}
		
	}

}


 

3、网络蜘蛛,收集网页中的邮箱地址信息。

SpiderDemo类:

package cn.hncu.net.bs;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class SpiderDemo {
   
	@Test//本地爬
	public void getMailsLoc() throws IOException{
		String mailReg="\\w+@\\w+(\\.\\w+)+";//@163.com   [email protected]
	    Pattern p = Pattern.compile(mailReg);//正则表达式对象(正则工具)
	    
		BufferedReader br = new BufferedReader( new FileReader(".\\bin\\cn\\hncu\\net\\bs\\mails.html"));
	    String line = null;
	    while( (line=br.readLine())!=null){
	    	Matcher m = p.matcher(line);
	    	while(m.find()){
	    		System.out.println(m.group());//group方法返回:符合正则规则的那段字符串
	    	}
	    }
    }
	
	@Test//上网爬---相比上一版本,只要更改IO中的源就行了
	public void getMailsNet() throws IOException{
		String mailReg="\\w+@\\w+(\\.\\w+)+";//@163.com   [email protected]
		Pattern p = Pattern.compile(mailReg);//正则表达式对象(正则工具)
		
		URL url = new URL("http://www.sina.com");
		BufferedReader br = new BufferedReader( new InputStreamReader(url.openStream()) );
		
		String line = null;
		while( (line=br.readLine())!=null){
			Matcher m = p.matcher(line);
			while(m.find()){
				System.out.println(m.group());//group方法返回:符合正则规则的那段字符串
			}
		}
	}
	
}


 

你可能感兴趣的:(Java之网络编程,Java从入门到高级编程)