Java网络通信

本文介绍了Java网络通信的基础概念,包括IP地址、端口号及其作用。详细讲解了如何通过InetAddress获取IP地址,以及InetSocketAddress的使用。此外,还阐述了URL资源定位的构成,并对比了UDP和TCP两种通信协议的特点和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 ip地址和端口号 

IP地址:确定网络上一个绝对地址(类似于一个房子的地址)

端口号:区分计算机软件(类似于房子的房门) 2个字节  0--65535

在同一协议下,端口号不能重复,不同协议下可以重复,1024一下的端口号一般分配给了系统用。

主机名到 IP 地址的解析通过使用本地机器配置信息和DNS来实现。要使用的特定命名服务默认情况下是本地机器配置的那个。对于任何主机名称,都返回其相应的 IP 地址。

InetAddress 类具有一个缓存,用于存储成功及不成功的主机名解析。

测试代码:

1.通过类InetAddress 获得(无构造器)

static InetAddress getLocalHost()返回本地主机

static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址。主机名可以是机器名(如"java.sun.com"),也可以是其 IP 地址的文本表示形式。

package com.sunlei.net.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetDemo02 {
	public static void main(String[] args) throws UnknownHostException {
		//使用getLocalHost方法创建InetAddress对象
		InetAddress addr = InetAddress.getLocalHost();
		System.out.println(addr.getHostName());//返回计算机名
		System.out.println(addr.getHostAddress());//返回ip
		
		//根据域名得到InetAddress对象
		addr = InetAddress.getByName("www.163.com");
		System.out.println(addr.getHostAddress());//返回ip
		System.out.println(addr.getHostName());
		
		//根据IP得到InetAddress对象
		addr = InetAddress.getByName("222.211.64.51");
		System.out.println(addr.getHostAddress());
		System.out.println(addr.getHostName());//返回域名
	}
}

2.通过类InetSocketAddress获得(有构造器)

    根据主机名和端口号创建套接字地址。尝试将主机名解析为 InetAddress。如果尝试失败,则将地址标记为未解析

package com.sunlei.net.ip;

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());
		
		InetAddress add = address.getAddress();
		System.out.println(add.getHostName());//返回计算机名
		System.out.println(add.getHostAddress());//返回ip
	}
}

二 URL资源定位

    代表一个统一资源定位符,它是指向互联网“资源”的指针。

    由四部分:协议,存放资源的主机域名,端口号,资源文件名(/之后)

    URL(String spee):绝对路径

    URL(URL context,String spee):相对路径构建

package com.sunlei.net.url;

import java.net.MalformedURLException;
import java.net.URL;

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

    html->格式化数据

    CSS->美化数据

    JS->交互数据


三 UDP通信(以数据为中心,非面向连接, 不安全,数据可能丢失,效率高,类似发短信)

1.客户端

(1)创建DatagramSocket类+指定端口

(2)准备数据(字节数组)

(3)打包(DatagramPacket+服务器地址及端口)

(4)发送

(5)释放资源

2.服务端

(1)创建服务端DatagramSocket类+指定端口

(2)准备接受容器(字节数组)

(3)包(接受数据)

(4)分析

(5)释放资源 

package com.sunlei.net.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/*
 * 客户端
 * */

public class MyClient {

	public static void main(String[] args) throws IOException {
		//创建客户端+端口
		DatagramSocket client = new DatagramSocket(6666);
		//准备数据
		String msg = "udp编程";
		byte[] data = msg.getBytes();
		//打包DatagramPacket(byte[] buf, int length, SocketAddress address)
		DatagramPacket packet = new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
		//发送
		client.send(packet);
		//释放
		client.close();
	}
}
package com.sunlei.net.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 服务端
 * */

public class MyServer {

	public static void main(String[] args) throws IOException {
		//创建服务端+端口
		DatagramSocket server = new DatagramSocket(8888);
		//准备接收容器
		byte[] container = new byte[1024];
		//封装成DatagramPacket(byte[] buf, int length) 
		DatagramPacket packet = new DatagramPacket(container,container.length);
		//接收数据(阻塞式接收)
		server.receive(packet);
		//分析数据
		byte[] data = packet.getData();
		int len = packet.getLength();
		System.out.println(new String(data,0,len));
		//释放资源
		server.close();
	}

}

四 TCP通信(面向连接 安全 可靠 效率高低 类似打电话)

package com.sunlei.net.tcp.socket;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		//创建客户端+指定端口   Socket(String host, int port) 
		Socket client = new Socket("localhost",8888);
		//接收数据
		/*
		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String echo = br.readLine();
		System.out.println(echo);
		*/
		DataInputStream dis = new DataInputStream(client.getInputStream());
		String echo = dis.readUTF();
		System.out.println(echo);
	}
}

package com.sunlei.net.tcp.socket;

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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值