网络模型: OSI模型和TCP/IP参考模型
OSI参考模型 TCP/IP参考模型
应用层
表示层 应用层
会话层
传输层 传输层
网络层 网际层
数据链路层
物理层 主机至网络层
一般来说开发处于传输测和网际层, 应用层为:FTP和HTTP协议, 传输层为:UDP和TCP等。 网际层为IP。
通常用户操作的是应用层, 而编程人员需要的做的事传输层和网际层, 用户在应用操作的数据,经过逐层封包, 最后到物理层发送到另一个模型中, 再进行逐层解包, 图示为:
2. 网络通信三要素: IP地址, 端口号, 传输协议
A. IP地址
他是网络中的设备标识
不易记忆,可用主机名表示, 两者存在映射关系
本机回环地址, 127.0.0.1 主机名名为 localhost
Ip地址: java中对应的InetAddress类, 存在于java.net包中
IntAddress类
(一)无构造函数, 可通过getLocalHost()方法获取IntAddress对象,
IntAddress i = InetAddress.getLocaHost();
Socket
1、它被称之为插座,相当于港口一样,是网络服务提供的一种机制。
2、通信两端都要有Socket,才能建立服务。
3、网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
UDP/TCP
UDP
面向无连接:将数据及目的封装在数据包中(需要明确地址和端口),不需要建立连接
每个数据包的大小限制在64K内
因为无连接,是不可靠协议
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道
在连接中进行大数据传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率低
TCP客户端
1,建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2,如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。
import java.net.*;
import java.io.*;
//需求:客户端给服务器端发送一个数据。
class TcpClient{
public static void main(String[] args) throws Exception{
Socket s = new Socket("10.1.31.69",10002);
OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。
out.write("tcp done!".getBytes());
s.close();
}
}
TCP服务端:
1,创建服务端socket服务,并监听一个端口。
2,服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。
3,可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。
4,如果通讯结束,关闭资源。注意:要先关客户端,再关服务端。
class TcpServer{
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(10002);//建立服务端的socket服务
Socket s = ss.accept();//获取客户端对象
String ip = s.getInetAddress().getHostAddress();
//可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。
InputStream in = s.getInputStream();
//读取客户端的数据,使用客户端对象的socket读取流
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
// 如果通讯结束,关闭资源
s.close();
ss.close();
}
}