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 = "\\[email protected]\\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= "\\[email protected]\\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();
        }
    }
}
时间: 2024-10-18 13:46:37

Java---网络编程(4)-C/S-B/S的相关文章

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络

java网络编程serversocket

转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerSocket用法详解 1.C/S模式中,Server需要创建特定端口的ServerSocket.->其负责接收client连接请求. 2.线程池->包括一个工作队列和若干工作线程->工作线程不断的从工作队列中取出任务并执行.-->java.util.concurrent->线程池

20145311实验四 &quot;Java网络编程及安全&quot;

20145311实验四 "Java网络编程及安全" 程序设计过程 实验内容 ·掌握Socket程序的编写:·掌握密码技术的使用:·设计安全传输系统 ·利用加解密代码包,编译运行代码,一人加密,一人解密:·集成代码,一人加密后通过TCP发送: 实验步骤 在这之前进行了一个socket连接的例子:用百度做了个实验 下面是两人合作进行RSA的加密: 首先建立一个Socket对象,用来连接特定服务器的指定端口(我负责的是服务器端,郑凯杰负责的是客户端,所以也就是输入我这边的ip地址),输入的参

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So

20145331实验五 Java网络编程及安全

实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统 4.结队伙伴:20145333赵嘉鑫 博客地址:http://home.cnblogs.com/u/5301z/ 5.分工:自己负责服务端,伙伴负责客户端 实验要求 1.基于Java Socket实现安全传输 2.基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器 3.使用Git进行版本控制 4.选择对称算法进行数据加解密. 5.选择非对称算法对对称加密密

20145301实验五 Java网络编程及安全

北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:30 实验名称:实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端 4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文.计算

实验五 Java网络编程及安全

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592   姓名:曾俊宏  学号:20159210 成绩:___________  指导老师:娄嘉鹏    实验日期 :2015.10.25 实验名称:                          Java 网络编程及安全 实验内容:      1.掌握 Socket程序的编写    2.掌握密码技术的使用    3.设计安全传输系统 我的实验搭档是蔡斌思    http://www.

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

java网络编程与安全

北京电子科技学院(BESTI) 实     验    报     告 课程:JAVA程序设计  班级:1253   姓名:魏昊卿  小组伙伴:杨舒雯 学号:20135203   伙伴:20135324 成绩:             指导教师:娄嘉鹏          实验日期:2015.6.09 实验密级:  无     预习程度:            实验时间15:30~18:00 仪器组次:         必修/选修:选修                 实验序号:04 实验名称:ja