黑马程序员——Java中网络编程笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


网络编程

  网络参考模型:


OSI参考模型              TCP/IP参考模型
|-- 应用层                  |
|-- 表示层                  |-- 应用层
|-- 会话层                  |
|-- 传输层                  |-- 传输层
|-- 网络层                  |-- 网际层
|-- 数据链路层              |
|-- 物理层                  |-- 主机至网络层




网络传输要素


 IP地址:用来唯一标识网络中的一台计算机。不易记忆,可用主机名
关于IP地址最后一位 
0是网段地址 
255是广播地址 
有效IP是1-254


 端口号:用于标识网络通信时同一台主机上的不同进程。
范围:0~65535,其中1~1024为系统保留端口号。

传输协议:TCP和UDP 


UDP: 
1)将数据及源和目的封装成数据报中,不需要建立连接 
2)每个数据报的大小在限制在64k内 
3)因无连接,是不可靠协议 
4)不需要建立连接,速度快 


TCP: 
1)建立连接,形成传输数据的通道。 
2)在连接中进行大数据量传输 
3)通过三次握手完成连接,是可靠协议 
4)必须建立连接,效率会稍低 


Java的网络编程


java.net包 
IP地址对用的操作类InetAddress


常用方法


//构造方法
static getLocalHost() 获取本机IP对象
static getByName(String add) 获取指定计算机名的计算机IP地址
//其他方法
getHostAddress() 获取IP地址
getHostName() 获取主机名


Socket:就是为网络服务提供的一种机制
- 通信双方都有Socket 
- 网络通信就是Socket通信 
- 数据在两个Socket间通过IO传输


UDP:发送端与接收端


java.net.DatagramPacket


建立udp传输的相关要素: 


1)DatagramSocket(封装了udp传输协议的socket对象。)与DatagramPacket(数据报对象) 
2)建立发送端,接收端。 
3)建立数据包,数据包中包括目的地址、端口、数据等信息。 
4)调用Socket的发送接收方法。 
5)关闭Socket。 


1)UDP发送端


实现思路: 
1. 建立UDP的socket服务 
2. 将要发送的数据封装到数据包中 
3. 通过UDP的socket服务将数据包发送出去 
4. 关闭socket服务

示例:

//使用DatagramSocket对象创建对象
DatagramSocket ds = new DatagramSocket();
//将要发送的数据封装到数据包中
String str = "要发送的数据";
//将数据封装到DatagramPacket对象
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 10000);
//通过socket服务将数据包发送出
ds.send(dp);
//关闭资源
ds.close();

2)UDP接收端


实现思路: 
1. 建立UDP的socket服务, 指定端口号 
2.创建数据包, 用于存储接收的数据 
3.使用socket服务的receive方法将接收的数据存储到数据包中 
4. 通过数据包的方法解析数据 
5. 关闭资源

示例:

//建立UDP socket服务
DatagramSocket ds = new DatagramSocket(10000);
//创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//使用接收方法将数据存储到数据包
ds.receive(dp);
//通过数据包对象方法, 解析数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + "..." + port + "..." + text);
//关闭资源
ds.close();

发送端与接收端是两个独立的运行程序。


TCP

分为两部分 
- 客户端:  
- 服务端: 


1)客户端Socket
实现思路:
1. 建立TCP客户端的socket对象, 指定端口号2. 如果连接建立成功, 说明数据传输通道已建立. 可以通过getOutPutStream和getInputStream获取输出和输入字节流数据 
3. 使用输出流, 将数据写出 
4. 关闭资源

示例:

//创建客户端socket
Socket socket = new Socket("192.168.25.100", 10000);
//获取socket流中的输出流
OutputStream out = socket.getOutputStream();
//使用输出流将指定的数据写出
out.write("哈喽".getBytes());
//关闭资源
socket.close();

2)服务端ServerSocket

实现思路: 
1.创建服务端socket服务, ServerSocket 
2. 服务端对外提供端口进行监听 
3. 获取连接过来的客户端对象 
4. 通过客户端对象获取socket流, 读取客户端数据 
5. 关闭资源(关客户端防止占用资源, 关服务端)


示例:

//创建服务端对象
ServerSocket ss = new ServerSocket(10000);
//获取连接的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
//通过socket对象获取输入流读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf, 0, len);
Syste,.out.println(ip+" : "+text);
//关闭资源
s.close();
ss.close();

Tcp传输最容易出现的问题


客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:
因为read方法或者readLine方法是阻塞式。
解决办法:
自定义结束标记
使用shutdownInput,shutdownOutput方法。

你可能感兴趣的:(笔记)