Java---网络编程(4)-C/S-B/S
C/S 与 B/S
☆ C/S ( Client/Server ) 客户端和服务端的特点
1、客户端和服务端的软件都需要程序员进行编写。
2、客户端维护起来较为麻烦。(缺陷)
3、客户端的存在可以将一部分运算分离到客户端来运行,减轻了服务器端的压力。(优势)
☆ B/S ( Browse/Server ) 浏览器和服务端的特点
1、客户端不用程序员编写,直接使用系统中具备的浏览器软件作为客户端即可。程序员只需要编写服务器端就OK了。
2、维护起来也很容易,因为只要维护服务器即可。(优势)
3、所有的运算都在服务器端,相对压力较大。(缺陷)
编程练习1
1、自定义一个服务器,接收浏览器发来的信息。显示浏览器发送了什么信息,并向浏览器发送简单的网页信息。
只实现了单线程~~~多线程我写了~只是由于不知道的原因~会出现Socket异常关闭的情况~!所以并没有实现~
单线程:成功~
package cn.hncu.bs;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author 陈浩翔
*
* @version 1.0 2016-5-11
*/
public class MyServer {
public static void main(String[] args) {
try {
while (true) {
ServerSocket server = new ServerSocket(80);
Socket s = server.accept();
System.out.println(s.getInetAddress().getHostAddress()
+ "...来访");
InputStream in = s.getInputStream();
byte buf[] = new byte[1024];
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(text);
BufferedReader bin = new BufferedReader(new FileReader(
"chx.html"));
// 要加true刷新PrintWriter流
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
String line = null;
while ((line = bin.readLine()) != null) {
pw.println(line);
}
in.close();
pw.close();
s.close();
server.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
多线程:失败了的例子:
求解:
package cn.hncu.bs;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author 陈浩翔
*
* 2016-5-10
*/
public class MyServer {
public static void main(String[] args) {
try {
while(true){
ServerSocket server = new ServerSocket(80);
//多客户同时访问
Socket s = server.accept();
new Thread(new ServerThread(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread implements Runnable{
Socket s = null;
public ServerThread(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...来访问了~");
InputStream in = s.getInputStream();
byte buf[] = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
BufferedReader bin = new BufferedReader(new FileReader("chx.html"));
//要加true刷新PrintWriter流
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bin.readLine())!=null){
System.out.println(line);
pw.println(line);
}
in.close();
pw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我老师给的解释是:
在练习MyServer时采用多线程都出现了多次请求与应该的情况,这很可能是TCP的三次握手造成的,即客户浏览器跟服务器进行几次请求与应答通讯,而服务器在第二次(同一次请求中的第2次握手)收到信息时却用另一个线程去接,因此握手就实现不了,而服务器却多次输出收到消息
编程练习2
2、模拟一个浏览器客户端向服务器发请求,接收并显示响应消息。
package cn.hncu.bs;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author 陈浩翔
*
* @version 1.0 2016-5-11
*/
public class MyBrowse {
public static void main(String[] args) {
String ipAdd = "www.hncu.net";
try {
Socket s = new Socket(ipAdd, 80);
//向服务器发送http协议请求头,以让服务器认识我们,给我们正确地响应
OutputStream out = s.getOutputStream();
System.out.println(s.getPort());//端口
PrintWriter pw = new PrintWriter(out,true);
pw.println("GET / HTTP/1.1");//请求行包含: 请求方式(GET POST) 空格 请求的资源路径 空格 http的协议版本
pw.println("Accept: */*;");
pw.println("Host: "+ipAdd);//下面这些key-value是请求头
//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");
pw.println("Connection: close");//如果没有这一句,程序不会自己结束的
pw.println();//空行---http协议请求头结束之后,必须要一个空行
System.out.println("请求完毕!");
//接收服务器的响应
InputStream in = s.getInputStream();
int len=0;
byte b[] = new byte[1024];
while((len=in.read(b))!=-1){
String str = new String(b,0,len,"UTF-8");
System.out.println(str);
}
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
响应过来的消息就是:
HTTP/1.1 200 OK
Date: Wed, 11 May 2016 10:56:05 GMT
Server: VWebServer
X-Frame-Options: SAMEORIGIN
Last-Modified: Wed, 11 May 2016 06:04:55 GMT
ETag: "6060-5328ad214afc0"
Accept-Ranges: bytes
Content-Length: 24672
Vary: User-Agent,Accept-Encoding
Cache-Control: private, max-age=600
Expires: Wed, 11 May 2016 11:06:05 GMT
Connection: close
Content-Type: text/html
Content-Language: zh-CN
//后面的就是网站的html代码了~~~
?<!DOCTYPE html><html><head><title>湖南城市学院</title>
...
...
...
...
</body></html>
编程练习3:
3、网络蜘蛛,收集网页中的邮箱地址信息。
package cn.hncu.bs;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
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;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;
/**
* @author 陈浩翔
*
* @version 1.0 2016-5-11
*/
public class SpiderDemo {
//读取网页的邮箱
public static void main(String[] args) {
try {
URL url = new URL("http://www.sina.com.cn/");
System.out.println(url.getHost());
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());
}
}
System.out.println("读取完!");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 先测试本地的邮箱地址看能不能读取出来---成功
*/
@Test
public void Test() {
try {
BufferedReader br = new BufferedReader(new FileReader("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());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java---网络编程(4)-C/S-B/S的更多相关文章
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
- 20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
- java 网络编程复习(转)
好久没有看过Java网络编程了,现在刚好公司有机会接触,顺便的拾起以前的东西 参照原博客:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942 ...
- JAVA课程实验报告 实验五 Java网络编程及安全
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225《Java程序设计》 实验五 Java网络编程及安全
20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...
- Java 网络编程----基本概念
网络现在是一个非常普遍的概念. 以下是维基百科上的解释: 网络一词有多种意义,可解作: 网络流也简称为网络(network).一般用于管道系统.交通系统.通讯系统建模. 有时特指计算机网络. 或特指其 ...
随机推荐
- c#中var关键字用法
Technorati 标签: C# 转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6175533 var关键字是C# 3.0开始新 ...
- 如何在ASP.NET 项目中使用Silverlight页面
闲来无事,想写个网站玩玩,比较懒,不想写太多的样式来美化,看中了Silverlight,样式布局比较省事,但是又不想全部都用Silverlight 来写,所以才有此一文. 其实Silverlight最 ...
- 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码
在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...
- zoom与transform:scale的区别
一. zoom特性 1. zoom是IE的私有属性,但目前除Firefox不支持外,其他浏览器支持尚好. 2.定义: zoom即变焦,可改变元素尺寸,属于真实尺寸.zoom:百分值/数值/normal ...
- win7下装ubuntu
需要的东西有: 1,ubuntu系统镜像,下载地址:http://www.ubuntu.com/download/desktop 选64位吧,兼容性好些. 2,空闲的大于20G硬盘空间,这个大小根据个 ...
- Windows phone 之独立存储
独立存储命名空间的说明:
- [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
最近把一个项目的jQuery升级到最新版,发现有些页面报错Cannot read property ‘msie’ of undefined.上jQuery网站上搜了一下,原因是$.browser这个a ...
- phpcms v9使用GET调用指定id文章内容、页面数据方法
不知道大家有没有相同的体会?在使用Phpcms V9建站调用数据的时候,基础的数据用默认的模板的调用语句就好了,但复杂不常见的数据怎么调用呢?我们技术可能会研究半天,怀着探索的精神不断尝试.孜孜不倦. ...
- 精通 Oracle+Python,第 6 部分:Python 支持 XML
无可辩驳的是,XML 现在是软件中信息交换的实际标准. 因此,Oracle 数据库附带了各种与 XML 相关的增强和工具,它们统称为 Oracle XML DB.XML DB 包含一系列嵌入到数据库中 ...
- interview:about Oracle表空间
Oracle表空间 SQL Server数据库与Oracle数据库之间最大的区别要属表空间设计.Oracle数据库开创性地提出了表空间的设计理念,这为Oracle数据库的高性能做出了不可磨灭的贡献.可 ...