一:网络模型:计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指 :
OSI(Open System Interconnection开放系统互连)参考模型
TCP/IP参考模型(HTTP/HTTPS)
比较重要,必须会背
二:网络通信三要素
IP地址:InetAddress 网络中设备的标识,不易记忆,可用主机名
端口号 用于标识进程的逻辑地址,不同进程的标识
传输协议 通讯的规则 常见协议:TCP,UDP
(1)如何获得ip地址?
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用
static InetAddress getByName(String host) 确定主机名称的IP地址。
public String getHostName()获取此IP地址的主机名。
public String getHostAddress()返回文本显示中的IP地址字符串。
public byte[] getAddress()返回此InetAddress对象的原始IP地址。 结果是网络字节顺序:地址的最高位字节在getAddress()[0]
public class InternetDemo1 { public static void main(String[] args) throws Exception { //part1 InetAddress address = InetAddress.getByName("192.168.2.227"); System.out.println(address); //part2 String hostName = address.getHostName(); System.out.println(hostName); //part3 String hostAddress = address.getHostAddress(); System.out.println(hostAddress); //part3 byte[] address1 = address.getAddress(); for (byte b : address1) { System.out.print(b); } } }
netstat -ano:查看端口号
(2)Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制: 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO传输。
(3)UDP :将数据源和目的封装成数据包中,不需要建立连接;每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
发送端口:
1、建立发送端的Socket对象
2、创建数据,并将数据打包
3、通过调用Socket的发送方法将数据包发出去
4、释放资源,关闭Socket
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendDemo { public static void main(String[] args) throws Exception{ DatagramSocket datagramSocket = new DatagramSocket(); byte [] bytes="这是发送端数据".getBytes(); int length=bytes.length; InetAddress address = InetAddress.getByName("192.168.2.227"); //有效端口:0~65535,其中0~1024系统使用或保留端口。 int port=10000; //DatagramPacket(byte[] buf, int length, InetAddress address, int port) //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。 DatagramPacket datagramPacket = new DatagramPacket(bytes,length,address,port); //void send(DatagramPacket p) //从此套接字发送数据报包。 datagramSocket.send(datagramPacket); datagramSocket.close(); } }
UDP接收端接收数据:
1、创建接收端的Socket对象
2、创建一个接收包(接收数据容器)
3、调用Socket的接收方法接收数据 receive()
4、解析数据包,获取数据,显示在控制台
5、释放资源,关闭Socket
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class ReveiceDemo { public static void main(String[] args) throws Exception{ //创建接收端的Socket对象 //DatagramSocket(int port) //构造数据报套接字并将其绑定到本地主机上的指定端口。 DatagramSocket ds = new DatagramSocket(10000); byte [] bytes=new byte[1024]; int length=bytes.length; //DatagramPacket(byte[] buf, int length) //构造一个 DatagramPacket用于接收长度的数据包 length 。 DatagramPacket dp = new DatagramPacket(bytes,length); ds.receive(dp);//该方法阻塞,直到接收到数据包 // 返回该数据报发送或接收数据报的计算机的IP地址。 InetAddress address = dp.getAddress(); //解析数据包,获取数据,显示在控制台 //public byte[] getData()返回数据缓冲区。 byte[] data = dp.getData(); int length1=data.length; String s = new String(data, 0, length1); System.out.println("发送端的ip地址是:"+address+"发送来的信息是:"+s); // ds.close();正常不用关,这里写的话就结收不到数据了 } }
先运行接收端,再运行发送端
练习:写一个输入端当键盘录入数据当时”886“结束传输
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendDemo3 { public static void main(String[] args) throws Exception{ DatagramSocket ds = new DatagramSocket(); BufferedReader bw = new BufferedReader(new InputStreamReader(System.in)); String len=null; while((len=bw.readLine())!=null) { if ("886".equals(len)) { break; } DatagramPacket dp = new DatagramPacket(len.getBytes(),len.getBytes().length, InetAddress.getByName("localhost"),10089); ds.send(dp); } ds.close(); } }
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class RevericeDemo2 { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10089); while (true) { byte[] bytes = new byte[1024]; int length = bytes.length; DatagramPacket dp = new DatagramPacket(bytes, length); ds.receive(dp);//该方法阻塞,直到接收到数据包 InetAddress address = dp.getAddress(); byte[] data = dp.getData(); int length1 = data.length; String s = new String(data, 0, length1); System.out.println("发送端的ip地址是:" + address + "发送来的信息是:" + s); } } }
(4)TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
TCP协议传输发送数据端
1、创建客户端的Socket对象
指定服务器的IP和端口,内部自动建立连接
一旦建立连接成功,说明与服务IO通道形成
2、获取输出流,往IO通道写数据
3、释放资源
import java.io.OutputStream; import java.net.Socket; public class CilentDemo1 { public static void main(String[] args) throws Exception{ //Socket(String host, int port) //创建流套接字并将其连接到指定主机上的指定端口号。 Socket s = new Socket("192.168.2.227", 10086); //获取输出流 //public OutputStream getOutputStream()throws IOException返回此套接字的输出流。 OutputStream os = s.getOutputStream(); os.write("我想睡觉".getBytes()); // os.close(); s.close(); } }
TCP协议接收数据服务器端
1、创建服务器端的Socket对象 ServerSocket
2、监听客户端连接,返回一个对应的客户端的Socket对象
3、获取输入流对象,读取数据,显示在控制台上
4、释放资源
import java.io.InputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo1 { public static void main(String[] args) throws Exception{ //创建服务器端的Socket对象 ServerSocket //ServerSocket(int port) ServerSocket ss = new ServerSocket(10086); Socket a = ss.accept(); //获取输入流对象,读取数据,显示在控制台上 //public InputStream getInputStream() 返回此套接字的输入流。 InputStream is = a.getInputStream(); byte[] bytes=new byte[1024]; int length = is.read(bytes); String s = new String(bytes, 0, length); //获取谁发送的信息,IP //public InetAddress getInetAddress()返回套接字所连接的地址。 InetAddress ip = a.getInetAddress(); System.out.println(ip+":"+s); a.close(); } }
同样还是先运行接受端再运行发送端