码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA网络编程

时间:2020-07-13 21:38:22      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:病毒   bytes   lock   put   asp   控制   nta   响应   缓冲   

JAVA网络编程

网络的定义

  • 我们将多台计算机按照一定的模式连接到一起的一种方式

  • 同一个网络中的计算机可以相互进行访问

主要功能

  • 资源共享

  • 信息传输与集中处理

  • 均衡负荷与分布处理

网络分层

由于结点之间联系很复杂,在制定协议时,把复杂成份分解成 一些简单的成份, 再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调 用下一层,而与再下一层不发生关系。

通信协议的分层

物数网传会表应

  • 物理层

  • 数据链路层

  • 网络层

  • 传输层

  • 会话层

  • 表示层

  • 应用层

物理层

  • 网络硬件人员需要具备的条件

  • 作为Java程序员了解即可?除非你给妹子接网线

网络层

  • 我们网络中有可能有很多的机器,如何唯一性的定位到你

  • 定位网络中的一台机器

  • IP

    • Internet protocol网络协议

    • IP分为IP4和IP6

    • 最初的是IP4占用4个字节,一个字节是[0-255].于是IP4的取值为0,2550,255

    • 一个企业也只占用几个公网IP

    • 因为IP4不够用了,于是诞生了IP6 ,IP6占用16个字节

    • 但是现在正处于ip4到ip6的转换过程中,需要一定的时间

  • port

    • 因为一台服务器只有一个IP,所以导致当别人访问这台服务器的时候

    • 我们还需要区分是访问的那个应用

    • 端口占用2个字节,范围是[0-65535] ,我们可以把一个应用绑定在一个端口上

    • 当别人访问这个端口的时候,就可以直接访问这个应用

    • 不要使用1024之下的端口,系统保留端口

  • IP是为了定位一台电脑,端口是为了定位一个应用

  • DNS

    • 域名系统(服务)协议

    • 是为了更好的记忆IP地址

    • 域名解析服务器:可以将域名解析成IP地址,以前有很多病毒专门做Hosts欺骗

  • InetAddress

    • 获取指定的IP地址,只通过IP定位到某一个主机

public class NetDemo01 {
public static void main(String[] args) throws UnknownHostException {
//static InetAddress getLocalHost() 返回本地主机的地址。  
InetAddress i1 = InetAddress.getLocalHost();
System.out.println(i1);   //DESKTOP-P04TCL5/192.168.14.111
//static InetAddress getByName(String host) 决定了IP地址的主机,主机的名字。  
InetAddress i2 = InetAddress.getByName("www.baidu.com");
System.out.println(i2);  //www.baidu.com/180.101.49.12

System.out.println(i1.getHostName());  //DESKTOP-P04TCL5
System.out.println(i1.getHostAddress());  //192.168.14.111

 

  • InetSocketAddress

    • 不但可以获取IP地址,还可以使用端口进行定位

    • 可以直接定位到某一个应用

  • URL--URI

    • 统一资源定位符

    • http://tool.cncn.com/youbian/100086

      • http:// 传输协议

      • tool.cncn.com IP地址 :80 默认网络传输的端口号为80

      • /youbian/100086 资源位置

    • https://www.ip138.com/post/search.asp?area=100086&action=area2zone

      • https:// 传输协议

      • www.ip138.com DNS -->IP地址 104.24.98.161 :80 端口号

      • search.asp 资源位置

      • ?area=100086&action=area2zone 请求的参数

    • 这个资源的定位是全网统一的,每一个资源在网络上都有一个唯一的定位

    • public class URLDemo03 {
      public static void main(String[] args) throws MalformedURLException {
      //URL(String spec)
      URL url = new URL("http://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");

      System.out.println(url);

      //getProtocol() 协议
      System.out.println("协议:"+url.getProtocol());
      System.out.println("域名:"+url.getHost());
      System.out.println("端口:"+url.getPort());
      System.out.println("资源:"+url.getFile());  ///index.html?name=zhangsan&pwd=123
      System.out.println("文件:"+url.getPath());  
      System.out.println("数据:"+url.getQuery());  
      System.out.println("锚点:"+url.getRef());  

传输层

  • TCP

    • 传输控制协议 

    • 包含: http https ftp  smtp

    • 数据相对安全的一种协议,基于连接的,如果使用tcp协议传输数据,必须先建立连接,然后发送数据

    • TCP相当于打电话

    • 三次握手,四次挥手

      • 建立连接时  

        • 1客户端发送一个连接请求到服务器

        • 2服务器检查自己并返回一条响应信息

        • 3客户端发送消息确认建立连接

      • 断开连接时

        • 1客户端发送请求说要断开连接

        • 2服务器开始受到请求,检查是否有未传输的数据

        • 3服务器检查完毕,确认断开

        • 4客户端也确认断开连接

    • 安全,但是效率有点低,后面专门做了一些优化措施

  • UDP

    • 用户数据包

    • 基于数据包发送的协议,我们的目的就是发送出去数据包

    • UDP相当于发短信

    • 相对效率较高,但是不安全

应用层

  • 对应的程序使用到网络传输的数据

Socket编程

UDP

UDP实现基本流程: 发送端     

  • 1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口

  • 2.准备数据--> 转为字节数组

  • 3.打包  DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。

  • 4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。

  • 5.关闭

public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是发送端------------------");
//1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
DatagramSocket  send = new DatagramSocket(7777);
//2.数据
byte[] msg = "Hello".getBytes();
//3.打包
DatagramPacket  packet = new DatagramPacket(msg,0,msg.length,new InetSocketAddress("localhost", 8888));
//4.发送
send.send(packet);
//5.关闭
send.close();
}
}

 

UDP实现基本流程: 接收端

  • 1.构建接收端

  • 2.准备包裹-->用来接收数据

  • 3.接收

  • 4.处理数据

  • 5.关闭

public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是接收端-----------");
//1.构建接收端
DatagramSocket  receive = new DatagramSocket(8888);
//2.准备包裹-->用来接收数据
byte[] arr = new byte[1024*60];
DatagramPacket  packet = new DatagramPacket(arr,arr.length);
//3.接收
receive.receive(packet);

//4.处理数据
/*
* byte[] getData()
         返回数据缓冲区。
  int getLength()
         返回将要发送或接收到的数据的长度。
*/
byte[] result = packet.getData();
int length = packet.getLength();
System.out.println(new String(result,0,length));

//5.关闭
receive.close();
}
}

TCP

tcp基于IO流操作

  • TCP 基本流程: 客户端

  • 1.创建客户端 Socket(String host, int port)  指定服务端的IP+端口

  • 2.获取IO流

  • 3.写出数据

  • 4.关闭

public class TCPClient03 {
public static void main(String[] args) throws UnknownHostException, IOException {
String name = "aaa";
String pwd = "123";
System.out.println("---------------client--------------");
//1.创建客户端
Socket client =  new Socket("127.0.0.1",8888);
//2.获取输入流
OutputStream os = client.getOutputStream();
//3.写出数据
os.write(("name="+name+"&pwd="+pwd).getBytes());
os.flush();

//获取输入流读取服务端响应
InputStream is = client.getInputStream();
byte[] car = new byte[1024];
int len = is.read(car);
System.out.println(new String(car,0,len));

//4.关闭
is.close();
os.close();
client.close();
}
}

tcp基于IO流操作

  • TCP 基本流程: 服务端

  • 1.创建服务端 ServerSocket(int port)   创建绑定到特定端口的服务器套接字。 服务端的端口号

  • 2.阻塞式监听

  • 3.获取IO流       

  • 4.读入数据

  • 5.操作数据

  • 6.关闭

public class TCPServer04 {
public static void main(String[] args) throws IOException {
System.out.println("---------------Server--------------");
//1.创建服务端
ServerSocket server = new ServerSocket(8888);
//2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------有一个客户端连接成功----------");

//3.获取IO流  
InputStream is = client.getInputStream();

//4.读入数据
byte[] car = new byte[1024];
//把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
int len = is.read(car);

String name =null;
String pwd =null;
//5.操作数据
String str = new String(car,0,len);
//分割数据 name=aaa&pwd=123
String[] arr = str.split("&");
for(String s:arr) {
String[] ss = s.split("=");
//判断当前这个ss[1]是名字的值还是密码的值
if("name".equals(ss[0])) {
name = ss[1];
}else {
pwd = ss[1];
}
}
System.out.println(name);
System.out.println(pwd);

//获取输出流
OutputStream os = client.getOutputStream();

//校验
if("111".equals(name) && "123".equals(pwd)) {
os.write("登录成功".getBytes());
}else {
os.write("shibai".getBytes());
}
os.flush();
//6.关闭
os.close();
is.close();
client.close();
server.close();
}
}

JAVA网络编程

标签:病毒   bytes   lock   put   asp   控制   nta   响应   缓冲   

原文地址:https://www.cnblogs.com/CHOI-6/p/13295540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!