java network - yaokun123/php-wiki GitHub Wiki

java网络编程

一、网络模型

  • 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();
    }
}