首先介绍一下协议:
UDP协议
用户数据报协议(User Datagram Protocol)
UDP是面向无连接通信协议
速度快,有大小限制,一次最多发送64K,数据不安全,容易丢失数据
TCP协议
传输控制协议(Transmission Control Protocol)
TCP协议是面向连接的通信协议
速度慢,没有大小限制,数据安全
InetAddress的使用
为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress供我们使用
InetAddress:此类表示Internet协议(IP)地址
常用方法
static InetAddress getByName(String host):确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName():获取此IP地址的主机名
String getHostAddress():返回文本显示中的IP地址字符串
UDP通信练习:
package socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 发送端需要
* 1创建发送的网络连接
* 2打包需要发送的数据
* 发送数据
* 3关闭连接
*/
public class Test01_SoketSend {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String msg = "需要发送的数据";
byte[] bytes = msg.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),9999);
socket.send(packet);
socket.close();
}
}
package socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端:
* 1:创建接收的网络连接
* 2:接收数据
* 解析数据
* 3:关闭连接
*/
public class Test02_SoketReceive {
public static void main(String[] args) throws Exception{
//参数指定接收的端口号
DatagramSocket socket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
socket.receive(packet);
byte[] bytes1 = packet.getData();
System.out.println(new String(bytes1,0,packet.getLength()));
socket.close();
}
}
练习:
TCP:
package socket;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test05_SoketServer {
public static void main(String[] args) throws Exception{
ServerSocket socket = new ServerSocket(9999);
Socket accept = socket.accept();
InputStream inputStream = accept.getInputStream();
int m;
byte[] bytes = new byte[1024];
while ((m=inputStream.read(bytes))!=-1){
System.out.print(new String(bytes,0,m));
}
inputStream.close();
socket.close();
}
}
package socket;
import java.io.OutputStream;
import java.net.Socket;
public class Test06_SoketClient {
public static void main(String[] args) throws Exception{
/**
* 三次握手:首先客户端向服务的发送连接请求
* 服务端返回响应
* 客户端再发送一个确认信息,获取连接
*
*/
Socket socket = new Socket("localhost",9999);
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = "发送的第一个数据".getBytes();
outputStream.write(bytes);
bytes = "发送的第二个数据".getBytes();
outputStream.write(bytes);
outputStream.close();
/**
* 第一次:客户端向服务器发出取消连接请求
* 第二次:服务器向客户端返回一个响应,表示收到客户端取消请求
* 服务器将最后的数据处理完毕
* 第三次:服务器向客户端发出确认取消信息
* 第四次:客户端再次发送确认消息(连接取消)
*
* 简记:我要走了,你要走了吗?你真的要走了吗?我真的要走了!
*/
socket.close();
}
}