Java面向网络编程
InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法
UDP
UDP发送数据
- 使用UDP协议发送数据
- 创建发送端Socket对象
- 创建数据并打包
- 发送数据
- 释放资源
- DatagramSocket:
- 此类表示用来发送和接收数据,基于UDP协议的
- DatagramSocket() :
- 创建Socket对象并随机分配端口号
- DatagramSocket(int port) :
- 创建Socket对象并指定端口号
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并打包
/*
* DatagramPacket :此类表示数据报包
* 数据 byte[]
* 设备的地址 ip
* 进程的地址 端口号
DatagramPacket(byte[] buf, int length,InetAddress address, int port)
*/
//待发送数据
String s = "hello udp,im comming!";
//缓冲区
byte[] bys = s.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getLocalHost();//发送给当前设备
int port = 8888;
//打包
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
//发送数据
ds.send(dp);
//释放资源
ds.close();
UDP接收数据
- 使用UDP协议接收数据
- 创建接收端Socket对象
- 接收数据
- 解析数据
- 输出数据
- 释放资源
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(8888);
//接收数据
//DatagramPacket(byte[] buf, int length)
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
ds.receive(dp);//阻塞等待接受数据
//解析数据
//InetAddress getAddress() : 获取发送端的IP对象
InetAddress address = dp.getAddress();
//byte[] getData() :获取接收到的数据,也可以直接使用创建包对象时的数组
byte[] data = dp.getData();
//int getLength() :获取具体收到数据的长度
int length = dp.getLength();
//输出数据
System.out.println("sender ---> " + address.getHostAddress());
//System.out.println(new String(data,0,length));
System.out.println(new String(bys,0,length));
//释放资源
ds.close();
TCP
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。
TCP发送数据
- 使用TCP协议发送数据
Socket(InetAddress address, int port)
- 创建发送端Socket对象(创建连接)
Socket s = new Socket(InetAddressInetAddress.getLocalHost(),10086);
- 获取输出流对象
OutputStream os = s.getOutputStream();
- 发送数据
String str = "hello tcp,im comming!!!";
os.write(str.getBytes());//write(byte[])
- 释放资源
TCP接收数据
服务端:ServerSocket
接收端:Socket
ServerSocket(int port)
ServerSocket accept()
- 创建接收端Socket对象
ServerSocket ss = new ServerSocket(10086);
- 监听(阻塞)
Socket s = ss.accept();
- 获取输入流对象
InputStream is = s.getInputStream();
- 获取数据
byte[] bys = new byte[1024];
int len;//用于存储读到的字节个数
len = is.read(bys);
- 输出数据
InetAddress address = s.getInetAddress();
System.out.println("client ---> " + address.getHostName());
System.out.println(new String(bys,0,len));
- 释放资源
s.close();
//ss.close();//服务端一般不用关闭
TCP特点
- 服务端不能主动向客户端发送信息,当客户端向服务端发送信息后,服务端可以向客户端发送信息。
按行发送
//创建客户端Socket对象
Socket s = new Socket("itheima",8888);
//获取输出流对象
PrintWriter out = new PrintWriter(s.getOutputStream(),true);//true表示开启自动换行
//写出数据
out.println("数据");
按行读取
//获取输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String s = br.readLine();