Java 网络编程

发布于 2021-06-30 12:34:21 字数 6088 浏览 1352 评论 0

一、网络模型

  • OSI(Open System Interconnection 开放系统互连)参考模型
  • TCP/IP 参考模型

七层简述

1、物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由0、1转化为电流强弱来进行传输,到达目的地后再转化为0、1,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

2、数据链路层:主要将从物理层接受的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

3、网络层:主要讲从下层接受到的数据进行IP地址(列:192.168.0.1)的封装与解封装。在这一层工作的设备是路由器。常把这一层的数据叫做数据包。

4、传输层:定义一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高、数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接受的数据进行分段和传输,到达目的地址后再进行重组。常把这一层叫做段。

5、会话层:通过传输层(端口号:传输端口号与接受端口号)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识,可以是IP也可以是MAC或者是主机名)

6、表示层:主要是进行对接受的数据进行解释、加密与解密、压缩与解压缩(也就是把计算机能够识别的东西转换成人能够识别的东西)

7、应用层:主要是一些终端的应用,比如FTP(各种文件下载)、WEB(IE浏览)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)

二、网络通讯要素

IP 地址(InetAdress)

网络中设备的标识

不易记忆,可用主机名

本地回环地址:127.0.0.1 主机名:localhost

端口号

用于标识进程的逻辑地址,不同进程的标识。

有效端口:0-65535,其中0-1024系统使用或保留端口。

传输协议

通讯的规则

常见协议:TCP、UDP

UDP(类似对讲机) 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快


TCP(类似电话) 建立连接,形成传输数据的通道 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低

三、socket(套接字)

Socket 就是为网络服务提供的一种机制,通信的两端都有 socket,网络通信其实就是 socket 通信,数据在两个 socket 间通过 IO 传输

四、UDP协议-发送端

DatagramSocket(此类表示用来发送和接收数据包的套接字)和 DatagramPacket(此类表示数据报包)

建立发送端和接收端

建立数据包

调用 Socket 的发送接收方法

关闭 Socket

发送端和接收端是两个独立的运行程序

示例

import java.net.InetAdress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.UnknowHostException;
public class UDPSendDemo{
  public static void main(String[] args) throws SocketException,UnknowHostException{
    //创建UDP传输的发送端

    //1、建立udp的socket服务
    DatagramSocket ds  = new DatagramSocket();

    //2、将要发送的数据封装到数据包中
    String str = "udp数据传输演示";
    byte[] buf = str.getBytes();
    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAdress.getByName("192.168.1.100"),10000);

    //3、通过udp的socket服务将数据包发送出去
    ds.send(dp);

    //4、关闭socket服务
    ds.close();
  }
}

五、UDP 协议 - 接收端

import java.net.InetAdress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.UnknowHostException;
public class UDPReceDemo{
  public static void main(String[] args) throws SocketException,UnknowHostException{
    //创建UDP传输的接收端

    //1、建立udp的socket服务,因为是要接受数据,所以必须要明确一个端口号。
    DatagramSocket ds  = new DatagramSocket(10000);

    //2、创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据。
    byte[] buf = new byte[1024];//提前知道数据有多大了,不写循环了
    DatagramPacket dp = new DatagramPacket();

    //3、使用socket服务的receive方法将数据存储到数据包中。
    ds.receive(dp);//阻塞式的

    //4、通过数据包的方法解析数据包中的数据(比如,地址、端口、数据内容)
    String ip = dp.getAdress().getHostAdress();
    int port = dp.getPort();
    String text = new String(dp.getData(),o.dp.getLength());

    System.out.println(ip+":"+port+":"+text);

    //5、关闭资源
    ds.close();
  }
}

六、TCP 协议 - 客户端

Socket(此类实现客户端套接字)和 ServerSocket(此类实现服务器套接字)

建立客户端和服务端

建立连接后,通过 Socket 中的 io 流进行数据的传输

关闭 socket

同样,客户端与服务器端是两个独立的应用程序。

示例

import java.IOException;;
import java.net.UnknowHostException;
public class ClientDemo{

  public static void main(String[] args) throws IOException,UnknowHostException{
    //TCP传输,客户端建立过程

    //1、创建tcp客户端socket服务,使用的是Socket对象。
    //建议该对象一创建就明确目的地。要连接的主机。
    Socket socket = new Socket("192.168.109.100",10000);

    //2、如果连接建立成功,说明数据传输通道已建立。
    //该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入又有输出。
    //要想输入或者输出流对象,可以找Socket来获取(getOutputStream/getInputStream)。
    OutputStream out = socket.getOutputStream();

    //3、使用输出流,将数据写出。
    out.write("TCP演示".getBytes());

    //4、关闭资源
    socket.close();
  }
}

七、TCP 协议 - 服务端

public class ServerDemo{
  public static void main(String[] args){
    //TCP传输,服务端建立过程

    //1、创建tcp服务端socket服务,使用的是ServerSocket对象。
    ServerSocket ss = new ServerSocket(10000);

    //2、服务端必须对外提供一个端口,否则客户端无法连接     

    //3、获取连接过来的客户端对象
    Socket s = ss.accept();//阻塞式
    String ip = s.getInetAdress().getHostAdress();

    //4、通过客户端对象,获取socket流读取客户端发来的数据
    InputStream in = s.getInputStream();
    //读取数据
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String text = new String(buf,0,len);
    System.out.println(ip+":"+text);

    //5、关闭资源。(关客户端、关服务端)
    s.close();
    ss.close();
  }
}

八、TCP 协议 - 服务端h和客户端交互

public class ClientDemo{
  public static void main(String[] args) throws IOException,UnknowHostException{
    Socket socket = new Socket("192.168.109.100",10000);

    OutputStream out = socket.getOutputStream();

    out.write("TCP演示".getBytes());

    //读取服务端返回的数据,使用socket读取流
    InptuStream in = socket.getInputStream();
    byte[] buf = new byte[1024];
    int len in.read(buf);
    String text = new String(buf,0,len);
    System.out.println(text);

    socket.close();
  }
}

public class ServerDemo{
  public static void main(String[] args){
    ServerSocket ss = new ServerSocket(10000);

    Socket s = ss.accept();//阻塞式
    String ip = s.getInetAdress().getHostAdress();

    InputStream in = s.getInputStream();

    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String text = new String(buf,0,len);
    System.out.println(ip+":"+text);

    //使用客户端socket对象输出流,给客户端返回数据
    OutputStream = s.getOutputStream();
    out.write("收到".getBytes());


    s.close();
    ss.close();
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文