Java---网络编程(4)-C/S-B/S

简介: C/S 与 B/S C/S ( Client/Server ) 客户端和服务端的特点1、客户端和服务端的软件都需要程序员进行编写。 2、客户端维护起来较为麻烦。(缺陷) 3、客户端的存在可以将一部分运算分离到客户端来运行,减轻了服务器端的压力。

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();
        }
    }
}
目录
相关文章
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
368 1
|
7月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
639 0
|
9月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
622 23
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
519 0
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
568 11
|
8月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
354 0