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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论