文章目录
1. 网络通信要素概述
- 通信双方的地址
- IP
- 端口号
- 一定的规则
- OSI参考模型
- TCP/IP参考模型 事实上的标准
2. 通信要素1-IP和端号
2.1 IP地址
- 唯一地表示Internet上的计算机
- 本地回环地址:127.0.0.1 主机名: localhost
- IPV4: 4个字节组成,32位
- IPV6:16个字节组成,128位
- 公网地址—万维网使用
- 私有地址—局域网使用,为组织机构内部使用 192.168开头
2.2 端口号
- 不同的进程有着不同的端口号
- 端口号是一个16位的整数 0~65535
- 端口分类
- 公认端口:0~1023 被服务通信占用 比如HTTP 80 FTP 21 Telnet 23
- 注册端口 :分配给用户进程或应用程序 Tomcat 8080 MySQL 3306 Oracle 1521
- 动态/私有端口:49152~65535
- InetAddress没有提供公共的构造器,但是提供了如下几个静态方法来获取InetAddress实例
package javabasis.chapter14;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) throws UnknownHostException {
InetAddress address_1=InetAddress.getByName("www.baidu.com");
System.out.println(address_1);
//获取InetAddress 对象所含的域名
System.out.println(address_1.getHostName());
//获取InetAddress 对象所含的IP地址
System.out.println(address_1.getHostAddress());
//获取本机的IP地址
InetAddress address_2=InetAddress.getLocalHost();
System.out.println(address_2);
}
}
3.通信要素2-网络协议
- 两个重要的协议
- 传输快指协议TCP
- 用户数据包协议UDP
- TCP
- 使用前需要先简历TCP连接
- 传输前采用三次握手,点对点通信,可靠
- 用于客户端和服务端
- 四次握手释放连接,效率较低
- UDP
- 封装成数据包,不需要建立连接
- 每个数据包的大小限制在64K内
- 接收方不确认,不可靠
- 可以广播发送
- 结束时不需要释放资源,开销小,速度快
- Socket
- 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
- 通信的两端都需要由Socket
- 网络通信其实就是Socket间的通信
- Socketf分类
- 流套接字:使用TCP提供可靠的字节流服务
- 数据报套接字,使用UDP提供“尽力而为”的服务
4.TCP网络编程
4.1 基于Socket的TCP编程
-
客户端:
- 创建Socket
- 打开连接到Socket的输入/输出流
- 按照一定的协议对Socket进行读/写操作
- 关闭Socket
-
服务器端
- 调用ServerSocket(int port)
- 调用accept()
- 调用该Socket对象的getOutputStream和getInputStream,获取输出流和输入流 字节流
- 关闭ServerSocket和Socket对象
-
常用方法
- public Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号
- public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号
- public InputStream getInputStream()返回此套接字的输入流。可以用于接收网络消息
- public OutputStream getOutputStream()返回此套接字的输出流。可以用于发送网络消息
- public void close()关闭此套接字
package javabasis.chapter14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { Socket socket=new Socket("127.0.0.1",8888);//指定IP地址和端口号,服务器端端口号应一致 OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello Server!".getBytes()); InputStream inputStream = socket.getInputStream(); byte[] bytes=new byte[1024]; int read = inputStream.read(bytes); System.out.println(new String(bytes, 0, read)); socket.close(); } }
package javabasis.chapter14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server {//服务器端必须先建立一个套接字对象来等待客户请求 public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8888);//监听客户端的请求 Socket accept = server.accept(); InputStream inputStream = accept.getInputStream(); byte[] bytes = new byte[1024]; int read = inputStream.read(bytes); System.out.println(new java.lang.String(bytes, 0, read)); OutputStream outputStream = accept.getOutputStream(); outputStream.write("Server has got it!".getBytes()); accept.close(); server.close(); } }
5.UDP网络编程
-
类DatagramSocket和DatagamPacket实现了基于UDP的协议网络程序
-
常用方法
- public DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口
- public DatagramSocket(int port,InetAddress laddr)创建数据报套接字,将其绑定到指定的本地地址
- public void close()关闭此数据报套接字
- public void send(DatagramPacket p)从此套接字发送数据报包
- public void receive(DatagramPacket p)从此套接字接收数据报包
- public DatagramPacket(byte[] buf,int length)构造 DatagramPacket,用来接收长度为 length 的数据包。
- public DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
package javabasis.chapter14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { DatagramSocket ds=null; try { ds=new DatagramSocket(); byte [] by="hello world".getBytes(); DatagramPacket dp=new DatagramPacket(by, 0,by.length,InetAddress.getByName("127.0.0.1"),10000); ds.send(dp); } catch (Exception e) { e.printStackTrace(); }finally{ if(ds!=null) ds.close(); } } }
package javabasis.chapter14; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { DatagramSocket ds=null; try { ds=new DatagramSocket(10000); byte [] by=new byte[1024]; DatagramPacket dp=new DatagramPacket(by, by.length); ds.receive(dp); String str=new String(dp.getData(),0,dp.getLength()); System.out.println(str+"--"+dp.getAddress()); } catch (Exception e) { e.printStackTrace(); }finally{ if(ds!=null) ds.close(); } } }