Java网络编程学习

版权声明:版权声明:转载必须注明本文转自StathamJ的博客:https://blog.csdn.net/qq_41664447 https://blog.csdn.net/qq_41664447/article/details/85222960

概念

  1. 网络:将不同区域的计算机连接到一起,互联网。
  2. 端口号:类似于电脑房子的房门,2个字节,由于一个字是8位,两个字节是16位,所以2的16次方=65535,端口号从0–65535共65536个。
    • 在同一个协议下,端口号不能重复,不同协议下可以重复。
    • 1024以下的端口号尽量不要使用,防止有些固定的端口被占用(eg:80–>http,21–>ftp)。
  3. 资源定位:
    • URL:统一资源定位符(L表示Locator)
    • URI:统一资源
  4. 数据的传输
    • TCP协议与UDP协议TCP协议与UDP协议:
      • TCP(Transfer Control protocol):传输控制协议,电话 类似于三次握手 面向连接 点到点 安全可靠 效率相对低下(必须等待连接)
      • UDP(User Datagram Protocol):用户数据包协议,短信 非面向连接 效率高 安全性低 数据可能丢失(只管往外发)
    • 传输:先封装,后拆封。
  5. Java网络编程相关类
    • InetAddress InetSocketAddress
    • URL
    • TCP:ServerSocket Socket
    • UDP:DatagramSocket DatagramPacket

InetAddress

  1. 封装计算机的IP地址和DNS,没有封装端口。
  2. 方法代码举例:
import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetDemo01 {
	public static void main(String[] args) throws UnknownHostException {
		//使用getLocalHost方法创建InetAddress对象
		InetAddress addr=InetAddress.getLocalHost();
		System.out.println(addr.getHostAddress());//显示本机ip地址
		System.out.println(addr.getHostName());//显示计算机名
		//根据域名得到InetAddress对象
		InetAddress addr01=InetAddress.getByName("www.163.com");
		System.out.println(addr01.getHostAddress());//返回163服务器的ip地址
		System.out.println(addr01.getHostName());//显示域名
		//根据ip得到InetAddress对象
		InetAddress addr02=InetAddress.getByName("219.147.92.64");
		System.out.println(addr02.getHostAddress());//返回163服务器的ip地址
		System.out.println(addr02.getHostName());//如果域名存在且允许解析,则返回域名,否则返回ip地址
	}
}

InetSocketAddress

  1. 封装计算机的IP地址、DNS和端口。
  2. 创建对象
    • InetSocketAddress(String hostname, int port)
    • InetSocketAddress(InetAddress addr,int port)
  3. 方法
    • getAddress()
    • getHostName()
    • getPort()
      代码举例:
import java.net.InetAddress;
import java.net.InetSocketAddress;

//在InetAddress的基础上,封装了端口
public class InetSocketDemo01 {
	public static void main(String[] args) {
		InetSocketAddress address=new InetSocketAddress("127.0.0.1",9999);
		System.out.println(address.getHostName());
		System.out.println(address.getPort());
		System.out.println(address.getAddress());
		InetAddress addr=address.getAddress();
		System.out.println(addr.getHostAddress());//显示本机ip地址
		System.out.println(addr.getHostName());//显示计算机名
	}
}

URL

  1. URI(Uniform Resource Identifier)统一资源标识符,用来唯一的标识一个资源。
  2. URL(Uniform Resource Locator)统一资源定位器,指向互联网资源的指针,它是一种具体的URI
  3. 统一资源定位符由4部分组成:协议(http协议等)、存放资源的主机域名、端口号(http协议的服务器默认端口是80)和资源文件名
    • eg:http(协议): / /www.baidu.com(存放资源的主机域名) :80(端口号)/index.xxx(资源文件名)
  4. 创建对象
    • URL(String spec):绝对路径构建
    • URL(URL context,String spec):相对路径构建
  5. 方法代码举例:
import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo {
	public static void main(String[] args) throws MalformedURLException {
		//绝对路径构建
		URL  url=new URL("http://www.baidu.com:80/index.html#aa?uname=test");
		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.getRef());
		System.out.println("参数:"+url.getQuery());//?参数:存在锚点(#aa) 返回null,不存在,返回正确
		//相对路径构建
		URL url1=new URL("http://www.baidu.com:80/a");
		URL url2=new URL(url1,"b.txt");
	}
}

UDP通信

  1. 以数据为中心,非面向连接,不安全,数据可能丢失,效率高
  2. 类DatagramSocket DatagramPacket
  • 客户端:
    • 创建DatagramSocket类(创建客户端)+ 指定端口
    • 准备数据 字节数组
    • 打包 DatagramPacket + 服务器的地址及端口
    • 发送
    • 释放资源
    • 代码举例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

//客户端
public class MyClient {

	public static void main(String[] args) throws IOException {
		//1创建客户端+端口
		DatagramSocket client=new DatagramSocket(6666);
		String msg="udp编程";
		//2将字符数据转化为字节数据储存
		byte[]data=msg.getBytes();
		//3打包(发送的地点及端口)
		//DatagramPacket(byte[],int(偏移量),int,SocketAddress)
		DatagramPacket packet=new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
		//4发送
		client.send(packet);
		//5释放
		client.close();
	}
}
  • 服务器端
    • 创建服务端 DatagramSocket类+指定端口
    • 准备接收容器 字节数组 封装 DatagramPacket
    • 包 接收数据
    • 分析
    • 释放资源
    • 代码举例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//服务端

public class MyServer {

	public static void main(String[] args) throws IOException {
		//1、创建服务端+端口
		DatagramSocket server=new DatagramSocket(8888);
		//2、准备接收容器
		byte[] container=new byte[1024];
		//3、将容器打包,封装成包
		DatagramPacket packet=new DatagramPacket(container,container.length);
		//4、接收数据,将数据接收到包packet中
		server.receive(packet);
		//5、分析数据
		byte[]data=packet.getData();
		int len=packet.getLength();
		System.out.println(new String(data,0,len));
		//6、释放
		server.close();
		//运行之后就开始在等待
	}
}

Socket通信

  1. 基于TCP:面向连接,安全可靠,效率低,类似于打电话
  2. 面向连接:请求-响应(Request-Response)
  3. Socket编程
  • 服务器端:ServerSocket
  • 代码举例
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
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 socket=server.accept();
		System.out.println("一个客户建立连接!");
		//发送数据
		String msg="欢迎使用!";
		//输出流!!!
		BufferedWriter bw=new BufferedWriter(
				new OutputStreamWriter(
				socket.getOutputStream()));
		bw.write(msg);
		bw.newLine();//结束当前行
		bw.flush();
	}
}
  • 客户端:Socket
  • 代码举例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws IOException {
		//创建客户端(指定服务器+端口)  就在此时连接
		Socket client=new Socket("localhost",8888);
		//接收数据 输入流!!!
		BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream()));
		String echo=br.readLine();//阻塞式 发送的服务器端需要结束当前行
		System.out.println(echo);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41664447/article/details/85222960