java学习笔记017 网络编程
1.网络通信要素
两个问题?
如何定位到网络上的主机?定位到主机上的应用?
通信地址
IP
端口号
找到主机后如何可靠高效地进行数据传输?
网络通信协议
OSI参考模型 过于理想化而未能广泛推广
TCP/IP参考模型(TCP/IP协议) 事实上的国际标准
分层
2.IP和端口号
IP
1)唯一标识Internet上的通信实体(计算机)
2)IP地址分类
IPv4
4个字节组成,4个0-255,大概45亿,2011年已用尽,eg:192.168.0.1
IPv6
128位,16个字节,写成8个无符号整数,每个数用4个十六进制位表示,数字之间用冒号隔开,eg:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
公网地址(万维网使用)
私有地址(局域网使用)
192.168开头,192.168.0.0到192.168.255.255专门为组织机构内部使用
域名 eg:www.baidu.com
DNS:域名解析服务器,返回域名对应的ip地址
先找本机hosts是否有输入的域名地址,没有再通过DNS服务器找
java中InetAddress类
represents an Internet Protocol(IP) address.
eg:
InetAddress ip1 = InetAddress.getByName("192.168.0.1");
InetAddress ip2 = InetAddress.getByName("www.baidu.com");
本地回环地址(hostAddress):127.0.0.1,主机名(hostName):localhost
InetAddress ip1 = InetAddress.getByName("127.0.0.1");
InetAddress ip3 = InetAddress.getLocalHost();
getHostName() / getHostAddress()
端口号
标识正在计算机上运行的进程
16位的一个整数,0-65535
分类
公认端口
0~1023,被预先定义的服务通信占用(如HTTP占用80,FTP占用21,Telnet占用23)
注册端口
1024~49151,分配给用户进程或应用程序(Tomcat占用8080,MySQL占用3306,Oracle占用1521)
动态/私有端口
49152~65535
IP与端口号组合得到一个网络套接字:Socket
网络通信协议
传输层中有两个协议TCP,UDP
传输控制协议TCP Transmission Control Protocol
用户数据报协议UDP User Datagram Protocol
TCP/IP协议不是两个协议,而是一组协议,TCP和IP是主要的两个
TCP
建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式
两个应用:客户端、服务端
可进行大数据量的传输
传输完毕,释放连接,效率低
“四次挥手”
UDP
将数据、源、目的地封装成数据包,不需要建立连接
每个数据包大小限制在64K以内
发送无须对方准备好,接收无需确认,不可靠
可以广播发送
发送结束时无需释放资源,开销小,速度快
3.java实现TCP网络编程
客户端client
eg:
InetAddress ip = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(ip, 8899);
OutputStream os = socket.getOutputStream();
os.write("HelloWorld".getBytes());
os.close();
socket.close();
服务端server
eg:
ServerSocket ss = new ServerSocket(8899); //创建服务端的ServerSocket,指明自己的端口号
Socket socekt = ss.accept();
InputStream is = socket.getInputStream();
int len;
byte[] bs = new byte[20];
ByteArrayOutputStream() baos = new ByteArrayOutputStream();
while((len = is.read(bs)) != -1){
baos.write(bs, 0, len);
}
System.out.println(baos.toString());
baos.close();
socket.close();
客户端发送文件给服务端
eg:
client
InetAddress ip = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(ip, 8899);
OutputStream os = socket.getOutputStream();
//读取文件
FileInputStream fis = new FileInputStream("filename.txt");
while...
socket.shutdownOutput(); //数据传输完成
server
ServerSocket ss = new ServerSocket(8899);
Socket socekt = ss.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("filename.txt");
while...
4.java实现UDP网络编程
DatagramSocket和DatagramPacket
发送端sender
eg:
DatagramSocket socket = new DatagramSocket();
InetAddress inet = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket("hello".getBytes(), 0, "hello".length(), inet, 9090);
socket.send(packet);
socket.clsoe();
接收端receiver
eg:
DatagramSocket socket = new DatagramSocket(9090); //指定自身端口号
byte[] buffer = new byte[20];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
5.URL
统一资源定位符(uniform resource locator),表示Internet上某一资源的地址
格式,包括五个部分
<协议>://<主机>:<端口>/<文件>#片段?参数列表
eg: http://localhost:8080/examples/beauty.jpg?username=hello
eg: 下载文件
URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=hello"); //java.net.URL
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
...
conn.disconnect();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧