黑马程序员技术交流社区
标题:
【石家庄校区】JavaSE第二阶段day12学习笔记
[打印本页]
作者:
lovemiya
时间:
2018-4-23 15:12
标题:
【石家庄校区】JavaSE第二阶段day12学习笔记
本帖最后由 小石姐姐 于 2018-4-27 11:29 编辑
[attach]225331[/attach]
面向网络编程学习笔记
Day 12网络
Socket
套接字
用于描述IP地址和端口, 是一种网络编程机制, 通信的两端都会有Socket
网络通信3要素
传输协议
IP地址
端口号
常用通信协议
UDP
它是一种无连接的不可靠协议
数据传输大小限制为64K(一个包)
不需要建立连接即可传输
数据发送速度快, 发送方只发送数据, 不检查接收方是否真正接收到数据, 所以数据有丢包的情况
这种方式适合实时性要求强的场合, 比如网络电话, 网络游戏等环境, 这种协议延迟很小
TCP
它是一种需要建立连接的可靠协议
没有数据传输大小的限制
在传输前需要先建立连接(三次握手)
它的重发机制保证了数据传输的准确性, 但因为需要接收方发回验证信息, 所以数据发送时间长, 数据流量大
这种方式适合准确性要求强的场合, 比如金融系统, 视频点播, 用户可以等待数据传输但是不能忍受错误
InetAddress类
java.net.InetAddress类: 用于表示IP地址对象, 可以获取主机名, IP地址等信息
静态方法
static InetAddress getLocalHost(): 获取本机的InetAddress对象
static InetAddress getByName(String host): 根据主机名或IP的字符串获取主机的InetAddress对象
static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象
成员方法
String getHostAddress(): 返回主机的IP地址
String getHostName(): 返回主机名
UDP相关类
java.net.DatagramSocket类: 基于UDP协议的Socket
构造方法
DatagramSocket(): 创建DatagramSocket对象, 随机分配端口号
DatagramSocket(int port): 创建DatagramSocket对象, 指定端口号
成员方法
void send(DatagramPacket p): 发送数据包
void receive(DatagramPacket p): 接收数据, 数据保存在DatagramPacket对象中
void close(): 关闭通信, 释放资源
java.net.DatagramPacket类: UDP数据包
构造方法
DatagramPackage(byte[] msg, int msgLength, InetAddress host, int port): 创建数据包对象, 指定数据, 目标主机对象, 端口
DatagramPacket(byte[] buf, int length): 创建数据包对象, 接收数据为length的数据, 存入byte数组中
成员方法
byte[] getData(): 获取包中的数据, 以byte数组形式
int getLength(): 获取数据包中数据的长度, 即byte数组的长度
int getPort(): 获取发送方端口号
InetAddress getAddress(): 获取数据包发送方的InetAddress对象
TCP相关类
java.net.Socket类: 基于TCP协议的Socket
构造方法
Socket(InetAddress add, int port)
成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输出流, 即接收数据
void close(): 释放资源
java.net.ServerSocket: TCP服务端
构造方法
ServerSocket(int port)
成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
void close(): 关闭Socket
代码演示
public class Send {
public static void main(String[] args){
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//准备数据
String s = "udp,im comming!!";
byte[] bytes = s.getBytes();
int length = bytes.length;
InetAddress address = InetAddress.getByName("192.168.15.255");
int port = 8888;
//创建数据报包对象
DatagramPacket dp = new DatagramPacket(bytes, length, address, port);
//发送数据
ds.send(dp);
//释放资源
ds.close();
}
}
public class Recieve {
public static void main(String[] args){
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(8888);
//定义字节数组
byte[] bytes = new byte[1024];
//创建包对象接受数据
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//解析数据
InetAddress address = dp.getAddress();
String sender = address.getHostName();
int len = dp.getLength();
//输出结果
System.out.println("sender --- "+sender+new String(bytes,0,len));
//释放资源
ds.close();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2