网络编程
网络编程 : 底层,关注数据如何传输,如何存储 节点 : 网络电子设备 节点与节点之间组成网络 IP : 表示节点 端口 : 区分不同的软件 URL : 互联网中资源的指针,统一资源定位符 协议 : 合同,标准,规范 传输层协议 : UDP : 相当于写信 只管写只管发 效率高 不安全 大小存在限制 TCP : 相当于打电话 面向连接 安全性高 效率低 大小没有限制 ****
IP :
定义网络中的节点 (网络电子设备,手机,电脑,路由器…) 分为 : IPV4(4个字节,32位) IPV6 (128位) 特殊IP: 192.168.0.0~192.168.255.255 非注册IP,供组织内部使用 127.0.0.1 本地IP localhost : 本地域名 域名与IP之间的关系: DNS解析器
public class IP {
public static void main(String[] args) throws UnknownHostException {
InetAddress address1 = InetAddress.getLocalHost();
System.out.println(address1);
System.out.println(address1.getHostName());
System.out.println(address1.getHostAddress());
InetAddress address2 = InetAddress.getByName("www.baidu.com");
System.out.println(address2);
System.out.println(address2.getHostName());
System.out.println(address2.getHostAddress());
}
}
端口
端口 : 区分软件 端口号 2个字节 0~65535 同一协议下端口号不能冲突 建议使用8000以上的,8000以下称为预留端口好 常见的端口: 80 : http 8080 : tomcat 1521 : Oracle 3306 : Mysql
public class Port {
public static void main(String[] args) {
InetSocketAddress in = new InetSocketAddress("localhost",8989);
System.out.println(in);
System.out.println(in.getHostName());
System.out.println(in.getPort());
}
}
URL
同一资源定位符,指向万维网上的“资源”的指针。 组成: 协议: 如,http ;域名:如, www.baidu.com ;端口号: 如,80;资源: 如,index.html;提交数据:如,name=zhangsan&pwd=123;锚点:如,#a 互联网 的三大基石: html、 http、 url;
public class Class003_URL {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("https://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");
System.out.println(url);
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("资源:"+url.getPath());
System.out.println("资源:"+url.getQuery());
System.out.println("资源:"+url.getRef());
}
}
结果为: 套接字: 传输层为应用层开辟的小口子 不同协议下Socket实现不同 UDP与TCP协议对Socket实现 UDP : 相当于写信|有包裹|发短信 非面向连接 协议简单,开销小,效率高 不安全 大小由限制(一般不超过60k) TCP : 相当于打电话 面向连接 效率低 安全 大小没有限制 基于三次握手 UDP协议下发送端与接收端两端平等 DatagramSocket 此类表示用于发送和接收数据报包的套接字。 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。 void receive(DatagramPacket p) 从此套接字接收数据报包。 void send(DatagramPacket p) 从此套接字发送数据报包。 DatagramPacket 该类表示数据报包。 byte[] getData() 返回数据缓冲区。 int getLength() 返回要发送的数据的长度或接收的数据的长度。 数据的传输基于字节数组
public class UDP_Send {
public static void main(String[] args) throws IOException {
DatagramSocket s = new DatagramSocket(9090);
System.out.println("-------------我是发送端-------------");
byte[] arr = "你好".getBytes();
DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("127.0.0.1",8989));
s.send(packet);
s.close();
}
}
public class UDP_Receive {
public static void main(String[] args) throws IOException {
DatagramSocket r = new DatagramSocket(8989);
System.out.println("-----------我是接收端------------");
byte[] arr = new byte[1024];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
r.receive(packet);
byte[] newArr = packet.getData();
int len = packet.getLength();
System.out.println(new String(newArr,0,len));
r.close();
}
}
TCP编程
TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低 Java中基于TCP协议实现网络通信的类 客户端的Socket类 服务器端的ServerSocket类 链接:https://www.jianshu.com/p/5de7306e15ab
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("-----------我是客户端--------------");
Socket client = new Socket("localhost",9999);
System.out.println("-----------与服务器端建立连接--------------");
String str = "你好";
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
os.writeUTF(str);
os.flush();
os.close();
client.close();
}
}
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("-----------我是服务器端-----------");
ServerSocket server = new ServerSocket(9999);
Socket client = server.accept();
System.out.println("-----------一个客户端连接成功----------");
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
String msg = is.readUTF();
System.out.println(msg);
is.close();
client.close();
server.close();
}
}
|