JAVA基础学习笔记_网络编程

发布于:2024-12-18 ⋅ 阅读:(107) ⋅ 点赞:(0)

网络编程

计算机之间通过网络进行数据传输
软件结构

  • C/S,Client/Server,客户端服务器,精美但麻烦
  • B/S,Browser/Server,浏览器服务器,方便但劣质
    比如说,浏览器上所有显示的资源都需要服务器传输,而客户端实现在本地存储了图片等资源,到时候告诉去哪访问就行了

网络编程三要素

  • IP,设备的唯一标识
  • 端口号,应用程序在设备中唯一的标识
  • 协议,UDP\TCP\HTTP\HTTPS\FTP

IP

IPv4,32位
IPv6,128位

IPv4细节
  • 局域网IP解决IP不够,以192.168…开头是局域网内的设备
  • 127.0.0.1表示本机
  • ipconfig查看本机ip地址,ping检查网络是否连通
InetAddress
public static void main(String[] args) throws UnknownHostException {
	//根据主机名获取ip信息
	InetAddress address = InetAddress.getByName("DESKTOP-2NA3243");
	System.out.println(address);
	//IP地址
	System.out.println(address.getHostAddress());
	//主机名
	System.out.println(address.getHostName());
}

端口号

  • 两个字节表示的整数,取值范围,0-65535
  • 0-1023之间的端口用于指明的网络服务或应用
  • 自己用1024以上的端口号就可以

协议

OSI演化为TCP\IP
UDP协议,面向无连接通信协议,速度快,只管发,不管收不收的到,比如视频会议,刷视频
TCP协议,面向连接的通信协议,安全可靠,比如发邮件,发消息

UDP

UDP协议(发数据)

public static void main(String[] args) throws IOException {
	//发送数据
	//创建socket对象(快递公司)
	//空参:端口随机指定一个作为发送端口
	//有参:端口指定一个作为发送端口
	DatagramSocket datagramSocket = new DatagramSocket();
	//打包数据
	String str = "你好威啊!!";
	byte[] bytes = str.getBytes();
	InetAddress address = InetAddress.getByName("127.0.0.1");
	int port = 10086;
	DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);

	//发送数据
	datagramSocket.send(datagramPacket);
	//释放数据
	datagramSocket.close();
}

UDP协议(接受数据)

public static void main(String[] args) throws IOException {
	//快递公司
	DatagramSocket datagramSocket = new DatagramSocket(10086);
	//接受数据
	byte[] bytes = new byte[1024];
	DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
	datagramSocket.receive(datagramPacket);
	//解析数据
	byte[] data = datagramPacket.getData();
	int length = datagramPacket.getLength();
	InetAddress address = datagramPacket.getAddress();
	int port = datagramPacket.getPort();
	System.out.println("接受到数据"+new String(data,0,length));
	System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口发送的");
	//释放资源
	datagramSocket.close();
}

UDP聊天室

单播,组播,广播

  • 单播,DatagramSocket()
  • 组播,MulticastSocket(),224.0.0.0-224.0.0.255是预留的组播地址
  • 广播,将发送的ip改为InetAddress.getByName(“255.255.255.255”);向局域网所有电脑发送信息

TCP

可靠的网络协议,在通信两端各建立一个scoket对象
接收端

public static void main(String[] args) throws IOException {
	ServerSocket serverSocket = new ServerSocket(10001);
	Socket accept = serverSocket.accept();
	InputStream inputStream = accept.getInputStream();
	int b;
	while ((b = inputStream.read()) != -1){
		System.out.println((char)b);
	}
	serverSocket.close();
	accept.close();
}

发送端

public static void main(String[] args) throws IOException {
	Socket socket = new Socket("127.0.0.1",10001);
	OutputStream outputStream = socket.getOutputStream();
	outputStream.write("aaa".getBytes());
	outputStream.close();
	socket.close();

}

中文乱码问题

中文一个字是3个字节
接受端修改

public static void main(String[] args) throws IOException {
	ServerSocket serverSocket = new ServerSocket(10001);
	Socket accept = serverSocket.accept();
	//InputStream inputStream = accept.getInputStream();
	//InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
	//BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
	//将字节流装换为字符流,并封装为缓冲流
	BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
	int b;
	while ((b = bufferedReader.read()) != -1){
		System.out.println((char)b);
	}
	serverSocket.close();
	accept.close();
}

代码细节,三次握手和四次挥手

三次握手协议,服务器监听,客户端先主动向服务器握手
四次挥手协议,需要保证服务器接受到了信息再断开连接


网站公告

今日签到

点亮在社区的每一天
去签到