【Java】 Java网络编程总结
一.网络编程三要素:
IP地址:每个设备在网络中的唯一标识。
端口号:每个程序在设备上的唯一标识。
协议:为计算机网络中进行数据交换而建立的规则或约定的集合。
UDP: 面向无连接,数据不安全,速度快,不区分客户与服务端。
TCP: 面向连接(三次握手),数据安全,速度略低,分客户端和服务端。
二.URI和URL以及URN:
URI:是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源,Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
    URI一般由三部组成:
      访问资源的命名机制
      存放资源的主机名
      资源自身的名称,由路径表示,着重强调于资源。
URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
    采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
      协议(或称为服务方式)
      存有该资源的主机IP地址(有时也包括端口号)
      主机资源的具体地址。如目录和文件名等
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。
  URN:uniform resource name,统一资源命名,是通过名字来标识资源。
    URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。
三.Socket编程:(Java网络编程的主要内容)
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤是两台计算机之间使用套接字建立TCP连接步骤:
1.服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
2.服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3.服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
4.Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
5.在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
6.连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现 socket。
下面是一个案例简单实现客户端上传文件到服务端:
客户端:
public class TCPClientDemo {
    public static void main(String[] args) throws IOException {
        //获取文件路径
        File file = getFile();
        //发送文件名到服务端
        Socket socket = new Socket("127.0.0.1",);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//用字符输入流包装字节输入流
        PrintStream ps = new PrintStream(socket.getOutputStream());//用打印流包装字节输出流
        ps.println(file.getName());//要上传的文件的名字
        String result = br.readLine();//读取,根据返回的参数确定是否需要上传
        if("文件已存在".equals(result)){
            System.out.println("您上传的文件已经存在,不需要再上传");
            socket.close();
            return;
        }else{//如果文件不存在,则上传文件
            FileInputStream in = new FileInputStream(file);//输入流获取整个文件
            byte[] b = new byte[];//定义缓冲区
            int len ;
            while ((len = in.read(b)) != -){//将文件放在客户端输出流中
                ps.write(b,,len);//注意,未知文件格式,不能用print方法,因为print方法不是字节流
                ps.flush();
            }
        in.close();
        socket.close();
        }
    }
    public static File getFile(){//获取文件路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您要上传的文件的路径:");
        while(true){
            String line = scanner.nextLine();
            File file = new File(line);
            if(!file.exists()){//如果文件不存在的话
                System.out.println("您录入的文件路径不存在,请重新输入");
            }else if(file.isDirectory()){//如果是一个文件夹
                System.out.println("不能上传文件夹,请重新输入");
            }else{
                return file;
            }
        }
    }
}
服务端:
public class TCPServerDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket();
        System.out.println("服务器启动");
        while(true){
            final Socket socket = server.accept();//用final修饰
            new Thread(){
                public void run(){
                    try {
                        InputStream in = socket.getInputStream();
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        String fileName = br.readLine();
                        File dir = new File("update");
                        dir.mkdir();//创建文件夹
                        File file = new File(dir,fileName);//封装成File对象
                        if(file.exists()){
                            ps.println("文件已存在");
                            socket.close();
                            return;
                        }
                        else{
                            ps.println("文件不存在");
                        }
                        FileOutputStream out = new FileOutputStream(file);//创建输出流(将从客户端获取的文件保存)
                        byte[] b = new byte[];
                        int len ;
                        while((len = in.read(b)) != -){//读取客户端的输出流的数据
                            out.write(b,,len);//把数据输出到文件中
                        }
                        out.close();
                        ps.close();
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
}
四.HTTP协议
Http协议是超文本传输协议。HTTP是一个标准,定义了Web客户端如何与服务器对话以及数据如何从服务器传回到客户端。在日常开发和使用过程中,HTTP经常被认为是一种用于传输HTML文件和文件中内嵌的图片的协议或者手段,实际上HTTP是一种通用的网络数据传输格式,它的传输内容不仅仅局限于HTML文件或者图片,也可以用来传输Microsoft Word文档甚至是Windows的exe文件等等,所有可以用字节序列表示的数据都可以使用HTTP进行传输。
HTTP通过TCP/IP进行数据传输,如果忽略底层的TCP协议的握手和挥手的细节,对于从客户端到服务器的每一个请求和请求的响应,在HTTP1.0有下面几个步骤:
1、默认情况下,客户端在端口80开启与服务器的一个TCP连接,当然也可以指定其他的端口。
2、客户端向服务器发送消息,请求指定路径上的资源。一个HTTP请求包括一个首部,可选项包括一个空行和这次请求的数据。
3、服务器向客户端发送响应。响应以响应码开头,接着是包含元数据的首部,可选项包括一个空行以及所请求的文档数据或者错误信息。
4、服务器关闭TPC连接。
在HTTP1.1(目前的主流)以及以后的HTTP版本中,可以通过一个TCP连接连续发送多个请求和接收多个响应。也就是说,上面的2和3步骤可以反复执行多次。另外,HTTP1.1中,请求数据和响应数据可以分块发送,提高了扩展性。
HTTP消息结构:
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(状态行),请求头(消息报头),空行和请求数据
服务端返回给客户端的响应消息也必须包括以下格式:请求行(状态行),请求头(消息报头),空行和请求数据,例如下图:
HTTP请求方法:
    
HTTP状态码详情如下:
    
    
    
    
以上状态码总结如下:
    
【Java】 Java网络编程总结的更多相关文章
- 二十三、Java基础--------网络编程
		Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ... 
- JAVA的网络编程
		网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ... 
- Java Socket 网络编程心跳设计概念
		Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ... 
- 20145325张梓靖 实验五 "JAVA的网络编程"
		20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ... 
- 【转】JAVA之网络编程
		转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ... 
- JAVA的网络编程【转】
		JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ... 
- Java面向对象 网络编程  下
		Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ... 
- Java面向对象 网络编程 上
		 Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ... 
- Java基础——网络编程(二)
		一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ... 
- java基础-网络编程(Socket)技术选型入门之NIO技术
		java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ... 
随机推荐
- git远程删除分支后,本地执行git branch -a依然能看到删除分支到底该咋整?
			使用命令git branch -a可以查看所有本地分支和远程分支(git branch -r 可以只查看远程分支) 如果发现很多在远程仓库已经删除的分支在本地依然可以看到到底该怎么办呢?(反正强迫症受 ... 
- hibernate映射配置
			1. 普通字段类型 2. 主键映射 单列主键映射 多列作为主键映射 主键生成策略,查看api: 5.1.2.2.1. Various additional generators 数据库: Q:一个 ... 
- 常用的CSS样式示例代码
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- AIxoder插件安装及使用
			参考:https://www.aixcoder.com/#/Download 右边有快捷导航,查看对应需要的问题 1.下载AIxcoder 2.安装并注册打开 3.给IDE安装 4.验证是否安装成 ... 
- hashcat 密码破解工具 使用教程
			日期:2019-08-16 15:03:12 更新: 作者:Bay0net 介绍:记录一下 hashcat 的使用命令 0x01.Install Hashcat Wiki - FAQ Github - ... 
- Bug解决:mysql 创建表字段Double类型长度
			excel导入数据进行新增时,发现安装高度和可视距离在数据库创建都是double类型 程序跑完,执行成功后,数据库的数据是2,小数点后的数据没有了 打印sql并执行后发现sql并没有错误, 检查数据库 ... 
- /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决  转载
			升级cmake时,提示“Error when bootstrapping CMake:Problem while running initial CMake”,第二次运行./bootstrap时,直接 ... 
- python-Web-数据库-Redis
			概述: >>>安装: >>>数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) &g ... 
- C#与Unity 数据存储
			使用Json存储数据 1.创建Json文件,直接创建txt文件,将后缀名改为xx.json 2.Json文件的数据格式,中括号表示列表,即中括号下的每个逗号隔开的内容都是列表的每个元素,花括号表示对象 ... 
- U盘安装win7"安装程序无法创建新的系统分区" 怎么办
			装WIN7的朋友,不知遇到该类问题没有: 当我们通过PE进行WIN7 纯安装的时候(非ghost安装),系统提示”安装程序无法创建新的系统分区,也无法定位现有分区“,迫使我们操作终断,无法进行. 面 ... 
