网络编程
分为局域网,城域网,广域网
OSI(Open System interconnection) 开放式系统互联
Tcp/Ip模型
三次握手四次挥手
TCP/UDP
端口号
TCP端口号:0~65535
UDP端口号:0~65535
一个端口号只能被一个程序使用。
一个程序可以占用多个端口号。
常用 | 端口号 |
---|---|
MySql | 3306 |
Oracle | 1521 |
Tomcat | 8080 |
SMTP | 25 |
Web服务器 | 80 |
FTP服务器 | 21 |
Web安全服务器 | 443 |
InetAddress类
//获取本机
InetAddress ia=InetAddress.getLocalHost();
ia.getHostName();//获得主机名
ia.getHostAddress();//获得主机ip地址
//获取局域网
InetAddress ib= InetAddress.getName("ip地址");//获得别的主机对象
ib.isReachable(time);//是否可达
//获取外网
InetAddress ib= InetAddress.getName("域名/主机名");
//获取域名的多个ip
InetAddress[] ics=InetAddress.getAllByName("域名/主机名")
Socket&&ServerSocket(套接字&&服务套接字)
服务端
//创建服务器套接字,并绑定端口号
ServerSocket listener = new ServerSocket(8888);
//监听客户端连接
Socket socket = listener.accept();
//获取输入流
InputStream inputStream = socket.getInputStream();
//转换流
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
//读取数据
String s = reader.readLine();
System.out.println(s);
//关闭资源
reader.close();
inputStream.close();
socket.close();
listener.close();
客户端
//创建套接字
Socket socket = new Socket("10.0.139.195",13579);
//获取输出流
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
//处理数据
writer.write("你好");
writer.flush();
//关闭资源
writer.close();
socket.close();
Java的socket是一个全双工套接字,任何的输入流或输出流的close()都会造成Socket关闭。
UDP
DatagramSocket:
数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
UDP协议的发送方
1.创建datagramSocket,可以不提供端口号,自动分配端口号
2.创建Datagrampacket,发送数据包
3.发送
4.关闭
//创建DataGramSocket
DatagramSocket socket = new DatagramSocket();
//创建发送包
String s="你好啊";
byte[] bytes =s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByAddress("10.0.139.119".getBytes()),8888);
//发送
socket.send(packet);
//关闭
socket.close();
UDP协议的接受方
1.创建datagramSocket,指定端口号
2.创建datagrampacket,接受数据包
3.接收,阻塞方法,接收到数据才返回
4.关闭
//创建datagramSocket
DatagramSocket socket = new DatagramSocket(8888);
byte[] bytes=new byte[1024*4];
//创建包
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//接受
socket.receive(packet);
//输出数据
String s=new String(packet.getData(),0,packet.getLength());
System.out.println(s);
//关闭
socket.close();