java网络编程心得_【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 classTCPClientDemo {public static voidmain(String[] args) throws IOException {//获取文件路径

File file =getFile();//发送文件名到服务端

Socket socket = new Socket("127.0.0.1",12345);

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[8192];//定义缓冲区

intlen ;while ((len = in.read(b)) != -1){//将文件放在客户端输出流中

ps.write(b,0,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= newFile(line);if(!file.exists()){//如果文件不存在的话

System.out.println("您录入的文件路径不存在,请重新输入");

}else if(file.isDirectory()){//如果是一个文件夹

System.out.println("不能上传文件夹,请重新输入");

}else{returnfile;

}

}

}

}

服务端:

public classTCPServerDemo {public static voidmain(String[] args) throws IOException {

ServerSocket server= new ServerSocket(12345);

System.out.println("服务器启动");while(true){

final Socket socket= server.accept();//用final修饰

newThread(){public voidrun(){try{

InputStreamin =socket.getInputStream();

BufferedReader br= new BufferedReader(new InputStreamReader(in));

PrintStream ps= newPrintStream(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("文件不存在");

}

FileOutputStreamout = new FileOutputStream(file);//创建输出流(将从客户端获取的文件保存)

byte[] b = new byte[8192];intlen ;while((len = in.read(b)) != -1){//读取客户端的输出流的数据

out.write(b,0,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请求方法:

4d705a0fcaa6f50037a32f6ca2743fbd.png

HTTP状态码详情如下:

af1c9602834b0374e216a2b0dd8f1f5d.png

75911329765a8eec09dbab86e159ded8.png

fe09a4b7ff630c8786417897f74d72f6.png

9dae756429edeed5df58a21c548c7fbb.png

以上状态码总结如下:

2c6a52fda2309a8453368d758f413502.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值