Java 网络编程

一、网络模型

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

Java 网络编程

七层简述

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

}

}

以上是 Java 网络编程 的全部内容, 来源链接: utcz.com/p/233530.html

回到顶部