一.网络编程三要素:

  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网络编程总结的更多相关文章

  1. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  2. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  3. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  4. 20145325张梓靖 实验五 "JAVA的网络编程"

    20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ...

  5. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  6. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  7. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  8. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  9. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

  10. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

随机推荐

  1. win10搜索框突然不能使用了

    备忘: win10搜索不出来了,使用以下方法恢复了,备忘下 1,首先打开任务管理器 重新启动wservice服务 2.发现这时候搜索依然不能使用 然后重新启动explorer.exe (1)右键关闭该 ...

  2. LC 672. Bulb Switcher II

    There is a room with n lights which are turned on initially and 4 buttons on the wall. After perform ...

  3. GitHub:Oracle

    ylbtech-GitHub:Oracle 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. https://github.com/oracle 2.   6 ...

  4. function $(id) { return typeof id === "string" ? document.getElementById(id) : id; }

    function $(id) {   return typeof id === "string" ? document.getElementById(id) : id; } 这句代 ...

  5. __linux__、__POSIX__宏

    __linux__用于定义linux,__POSIX__不太了解,各系统的宏有如下: std::string getOsName() { #ifdef _WIN32 return "Wind ...

  6. XML字符串和 java对象项目转换

    这是之前写,仅供参考(如果缺少jar包可以私信我,CSDN现在下载的东西太费了,动不动就要积分,开源精神所剩无几了,也没办法都需要吃饭,可以理解) import javax.xml.bind.JAXB ...

  7. 卷积的三种模式:full、same、valid + 卷积输出size的计算

    转自https://blog.csdn.net/u012370185/article/details/95238828 通常用外部api进行卷积的时候,会面临mode选择. 这三种mode的不同点:对 ...

  8. 什么是java的线程安全?同步,异步

    线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程 ...

  9. Django2.2 连接mySQL数据库

    一.Django2.2连接数据库(踩雷) 首先,Django2.2自带的是sqlite3数据库,但我们学的是mysql,因此学着连接(在mysql环境搭建成功的情况下)---参考博客: https:/ ...

  10. cm_api

    cm API:https://github.com/cloudera/cm_api/tree/master/python/examples/auto-deploy#看集群有几个clustercurl ...