Java中的小知识之---网络编程

网络编程概述

  • C/S和B/S

C/S :客户端,服务器软件结构

服务提供商给予用户需要准备的内容:各大平台客户端(Android IOS PC Windows Linux macOS);服务器提供服务

C/S的软件:QQ,微信,淘宝,京东。

软件更新,同时本地软件也要更新操作,这个操作 非常耗时

B/S: 浏览器,服务器软件结构

服务提供商只需要提供数据服务就OK,以及前端数据展示方式;浏览器提供商非常多(谷歌,火狐,Safari);服务器提供服务

软件更新,服务器更新数据,浏览器刷新一下就 OK 了

网络通信协议

  • 协议(protocol):

网络通信协议是要求双方传递数据的计算机必须遵守的。按照对应的网络传输协议,才可以进入数据的交互和传递。

目前网络端数据传输常见的协议:UDP TCP/IP

  • UDP  TCP/IP的区别

UDP : 1.面向无连接(广播,车载收音机),数据传递不算特别安全

2.传输速度快(广播传递)

3.数据传递存在丢包问题

4.没有客户端和服务器区别,都可以作为发送端和接收端。

5.使用场:视频直播,网络游戏

TCP/IP : 1.面向链接,数据传递较为安全

2.传输速度较慢(打电话挨个通知)

3.数据传递有保障

4.有非常明显的服务器和客户端概念

5.使用场景:客户端登录,数据下载,文件传输

网络编程三要素

  • 协议:

两个在网络情况下的计算机数据传递,都需要对应的协议来完成

  • IP地址(Internet Protocol Address):

当前计算机在网络中的一个地址编号,类似于手机号码,不可重复。

  • IP地址有IPV4协议和IPV6协议

IPV4是一个32位的二进制数,通常展示的效果是a.b.c.d  eg : 192.168.1.1;a b c d 各代表0~255的数字,目前已经消耗殆尽,42亿个。

IPV6协议:能够保证地球上的每一粒沙子都有一个IP地址,128位地址长度,16字节一组,8组组成,每一组都是:0x0 ~ 0xFFFF

  • 端口号

端口号是当花钱应用程序在计算机中的一个编号,可以让计算机明确知道,当前的数据是给予哪一个程序使用,或者数据从哪一个程序出现的。

端口号是一个short类型 0~ 65535

0~1024不能用于自定义端口号使用,这是特定的系统端口号

IP类

InetAddress:SUM公司提供给开发者使用的IP地质类

  • 常用方法:

InetAddress getLocalhost();获取本机IP地址类对象

InetAddress getByName(String str);根据指定的主机名字获取对应的IP地址对象

InetAddress[] getAllByName(String str);获取指定主机名或者域名对应的所有IP地址类对象

UDP协议数据传输

  • UDP数据传输方式

User Dategram Protocol : 数据传递采用数据包方式传递,所有的数据都要进行打包操作,并且没有对应的客户端服务器概念,有且只有发送端和接受端。

Socket :数据需要进行传递操作,在数据传递的两台计算机当中必须有对应的Socket;这里采用UDP协议,那么必须有一个UDP协议的Socket。

DatagramSocket();创建一个发送端UDP协议Socket对象

DatagramSocket(int port);创建一个接收端UDP协议的Socket对象,这里需要监听指定端口

发送端发送的数据如何到达接收端?

发送端数据包的打包方法:

DatagramPacket DatagramPacket(byte buf[] , int length , InetAddress address , int port);

buf:需要传递数据的字节数组

length:当前字节数组中的数据容量字节数

address:接收端IP地址对象

port:接收端对应的端口号

接收端数据包接收方式:

这里需要准备一个空的数据包

DatagramPacket DatagramPacket(byte buf[] , int length);

buf:字节缓冲数组,通常是1024整数倍

length:当前字节缓冲数组的容量

  • 发送端

流程:

1.创建UDP服务器对应的发送端Socket

2.准备对应的数据包,需要带有指定数据

3.发送数据 send

4.关闭UDP服务器

package com.wcc.a_ip;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/*
 * 流程:
 * 1.创建UDP服务器对应的发送端Socket
 * 2.准备对应的数据包,需要带有指定数据
 * 3.发送数据 send
 * 4.关闭UDP服务器
 */
public class Demo2 {
	public static void main(String[] args) throws IOException {
		System.out.println("发送端启动");
		
		//创建对应的Socket
		DatagramSocket socket = new DatagramSocket();
		//准备数据包
		byte[] bytes = "今天吃蒸羊羔...".getBytes();
		//(字节数组数据,字节数组数据长度,指定接收端IP地址,8848对应端口号)
		DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),8848);
		//发送端
		socket.send(packet);
		//关闭资源
		socket.close();
	}

}
发送端启动
数据发送完毕
  • 接收端

流程:

1.打开UDP服务,并且监听指定端口

2.创建新的空数据包

3.通过Socket接收数据 receive

4.关闭UDP服务接收端

package com.wcc.a_ip;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/*
 * 流程:
 * 1.打开UDP服务,并且监听指定端口
 * 2.创建新的空数据包
 * 3.通过Socket接收数据 reverse
 * 4.关闭UDP服务接收端
 */
public class Demo3 {
	public static void main(String[] args) throws IOException {
		//创建Socket监听端口
		DatagramSocket socket = new DatagramSocket(8848);
		
		//准备空数据包
		byte[] buf = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buf,buf.length);
		
		//接收数据
		socket.receive(packet);
		
		//确定读取到的字节长度
		int length = packet.getLength();
		
		System.out.println(new String(buf ,0 , length));
		
		socket.close();
	}
}
接收端启动
今天吃蒸羊羔...

注意:要先启动接收端!!

  • UDP数据传递丢失问题

1.网络不够好,稳定性不行,带宽不够

2.电脑性能不行

TCP/IP协议数据传输

  • 概述

TCP相对于UDP是比较稳定的传输协议,这里存在三次握手,保证连接状态,同时有明确的客户端和服务端之分;TCP服务中需要服务器先启动,需要监听指定端口,等待客户端链接

客户端主动连接服务器,和服务器链接之后,才可以进行数据交互,而服务器不能主动链接客户端。

对于TCP操作而言,Java中提供了两个Socket:

1.服务端Socket:java.net.ServeSocket

创建对应的ServeSocket开启服务器,等待客户端链接

2.客户端Socket

创建客户端Socket,并且链接服务器,同时将Socket发送给服务器绑定注册。

客户端Socket是给客户端提供数据传输的符合TCP/IP要求的Socket对象

构造方法 Constructor

Socket(String host , int port); host是服务器IP地址,port对应服务器程序的端口号,通过指定的服务器IP地址和端口号,获取TCP连接对象。

成员方法:

InputStream getInputStream(); 获取Socket对象输入字节流,可以从服务器获取对应的数据;InputStream是一个资源,需要在程序退出时关闭。

OutputStream getOutputStream(); 获取Socket 对象输出字节流,可以发送数据到服务器;OutputStream是一个资源,需要关闭

void close(); 关闭客户端Socket

void shutdownOutput(); 禁止当前Socket发送数据

TCP/IP协议对应的Socket是基于IO流实现的。

  • ServerSocket服务端Socket

在服务端开启Socket服务器

构造方法Constructor:

ServerSocket(int sort); 开启ServerSocket服务器,并且明确当前服务端口是谁。

成员方法Method:

Socket accept(); 监听并且链接,得到一个Socket对象,同时该方法是一个阻塞方法,会处于一个始终监听的状态,返回的是Socket,也就是客户端的Socket对象,获取到当前Socket对象,相当于获取到客户端链接,同时使用的Socket和客户端一致。

服务器代码:

流程:

1.创建ServerSocket服务器,同时监听指定端口

2.通过accept方法获取Socket链接,得到客户端Socket对象

3.通过Socket对象,获取InputStream,读取客户端发送数据

4.通过Socket对象,获取OutputStream,发送数据给客户端

5.关闭服务器

客户端代码:

流程:

1.创建Socket服务,同时民企古额链接服务器的IP地址和对应端口号

2通过Socket对象,获取对应的OutputStream对象,发送数据给服务器

3.通过Socket对象,获取对应的InputStream,接受服务器发送数据

4.关闭服务

 

 

 

 

 

发布了12 篇原创文章 · 获赞 25 · 访问量 8019

猜你喜欢

转载自blog.csdn.net/weixin_42597414/article/details/104647502