JAVA基础 网络编程
网络我们每天都会用到的,在我们生活中占的地位也在不断的提高,我们下面就简单了解下网络编程的内容。
想要学习网络编程,首先就需要了解网络编程包含哪些内容。
网络编程包括 IP节点,端口,URL,传输协议。下面我们就分别了解下
IP
IP是定义节点的,有两个重要的版本需要我们了解下,一个是IPV4,是4个字节32位的;另一个是127.0.0.1 ,一般192.168.0.0~192.168.255.255 供组织内部使用的IP,而我们本地的IP,也叫localhost ,IP是127.0.0.1 。
IP与域名:
DNS|域名解析器
InetAddress :getLocalHost,getHostAddress,getByName,
端口 port
端口是区分软件的,同一协议下端口是不能冲突的(即同一协议端口不能重复)
端口是2个字节 用0~65535之间的整数表示端口号
一般8000以内的端口号时预留的端口号。
我们常见的端口号也是需要了解的:
80: http
8080: tomcat
3306: mysql
1521: oracle
InetSocketAddress : 此类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口号)。
InetSocketAddress(int port) ;InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
getAddress;getHostName;getPort
URL
统一资源定位符。是互联网的三大基石(html,http,url)之一。指向万维网的资源的指针.
URL的组成:协议 http url.getProtocol()
域名 ww.XXX.com url.getHost()
端口号 默认是80 url.getPort()
访问的资源 index.html url.getFile()或url.getPath()
请求参数 username=zhangsan&password=123 url.getQuery()
锚链接 a url.getRef()
http://www.xxx.com:80/index.html?username=zhangsan&password=123#a
爬虫
我们可以简单通过URL写个小爬虫。结合我们之前学习到的IO流进行读取。
public static void main(String[] args) throws IOException {
//1.定位互联网中的某个资源
URL url = new URL("http://www.XXX.com");
//2.打开一个到此URL资源的一个输入流
//InputStream openStream() 打开与此 URL的连接并返回 InputStream以从该连接读取。
//InputStreamReader
BufferedReader is = new BufferedReader(new InputStreamReader(url.openStream()));
String msg = null;
while((msg = is.readLine())!=null){
System.out.println(msg);
}
is.close();
}
协议
传输协议有分为UDP和TCP,尤其是TCP更是需要我们掌握的。
**UDP:**是非面向面连接的,不安全的,协议简单,开销小效率高,只管写只管发送 一般不超过60k。
**TCP:**是面向连接,安全的,协议复杂,效率低,没有大小限制。
SOCKET 套接字:
相当于在传输层为应用层提供了一个接口,我们可以通过套接字Socket实现传输,不同的协议实现的方法不同,因此我们称为面向Socket编程。
UDP协议
DatagramSocket 定义发送端|接收端 Datagram(数据包)
DatagramPacket 打包
步骤:
发送端 | 接收端 |
---|---|
1.定义发送端 DatagramSocket(int port) 2.准备数据 3.打包 4.发送 send(DatagramPacket) 5.关闭 | 1.定义接收端 DatagramSocket(int port) 2.打包准备接收数据 3.接收 receive(DatagramPacket) 4.处理数据 5.关闭 |
发送端
public static void main(String[] args) throws IOException {
System.out.println("-----------------发送端------------------");
//1.定义发送端 DatagramSocket(int port)
DatagramSocket send = new DatagramSocket(8888);
//2.准备数据
byte[] arr = "晚安伽卡他卡".getBytes();
//3.打包
//DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("localhost",9999));
//4.发送 send(DatagramPacket)
send.send(packet);
//5.关闭
send.close();
}
接收端
public static void main(String[] args) throws Exception{
System.out.println("-----------------接收端------------------");
//1.定义接收端 DatagramSocket(int port)
DatagramSocket rec = new DatagramSocket(9999);
//2.打包准备接收数据
byte[] arr = new byte[1024];
//接收数据的包裹
DatagramPacket packet = new DatagramPacket(arr,0,arr.length);
//3.接收 receive(DatagramPacket)
rec.receive(packet);
//4.处理数据
byte[] datas = packet.getData();
int len = packet.getLength();
System.out.println("接收数据个数"+len);
System.out.println("接收数据"+datas.length);
System.out.println(new String(datas,0,len));
//5.关闭
rec.close();
}
TCP协议
客户端 | 服务端 |
---|---|
基于IO流,一个客户端就是一个Socket,包含输入输出 1.定义客户端 Socket 2.IO操作,获取输出流->写出 3.关闭 | tcp基础流程->服务器端 1.定义我是服务器端 ServerSocket(int port) 2.阻塞式监听 3.IO操作: 获取输入流 4.关闭资源 |
客户端
public static void main(String[] args) throws IOException {
System.out.println("tcp使用单项用户登录-->客户端");
//1.定义客户端
Socket client = new Socket("localhost",8989);
//2.io
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
out.writeUTF("username=laopei&password=1234");
out.flush();
//3.关闭
out.close();
client.close();
}
服务端
public static void main(String[] args) throws IOException {
System.out.println("tcp实现单项登录-服务端");
//1.定义服务端
ServerSocket server = new ServerSocket(8989);
//2.监听
Socket client = server.accept();
//3.io
DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
String str = in.readUTF();
System.out.println(str);
//存储用户输入的用户名和密码
String name = "";
String pwd = "";
//校验
String[] arr = str.split("&");
for(String ss:arr){
System.out.println(ss);
String[] s = ss.split("=");
if("username".equals(s[0])){
name = s[1];
}else if("password".equals(s[0])){
pwd = s[1];
}
}
if("laopei".equals(name) && "1234".equals(pwd)){
System.out.println("登录成功");
}else{
System.out.println("用户名或密码错误..");
}
//关闭
in.close();
client.close();
server.close();
}
同样也可以结合多线程等进行多客户端连接的操作。大家可以试下。