Android开发之UDP/TCP
TCP协议:传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP协议:用户数据报协议(User Datagram Protocol,UDP)是一种面向无连接的传输层协议,提供面向事物的简单不可靠信息传送服务。
UDP:
UDP客户端
- 调用DatagramSocket() 创建一个数据包套接字
- 调用DatagramPacket(byte[] buf ,int length ,InetAddress address,int port),建立要发送的UDP包
调用DatagramSocket 类的send()发送UDP包
示例代码如下:
DatagramSocket socket;
DatagramPacket packet;
try {
//初始化DatagramSocket对象
socket = new DatagramSocket();
//自定义端口号,应大于1023
int port = 4567;
//初始化InetAddress对象
InetAddress address = InetAddress.getByName("10.10.218.203");
//定义需要发送的信息
String content = "Hello world!";
//将信息转换为字节类型的数据
byte [] data = content.getBytes();
//初始化DatagramPacket对象
packet = new DatagramPacket(data,data.length,address,port);
//发送
socket.send(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(socket != null ){
//关闭数据包套接字
socket.close();
}
}
//PS:作为客户端向服务器端发送数据时,需要知道服务器端的ip地址和端口号。而此时服务器端不需要知道客户端的ip地址和端口号。
UDP服务器端
- 调用DatagramSocket(int port ) 创建一个数据包套接字,并绑定端口
- 调用DatagramPacket(byte [] buf, int length) 使用字节数组接收UDP包
调用DatagramSocket类的receive(),接收UDP包。
示例代码如下
DatagramSocket socket;
DatagramPacket packet;
try { //初始化DatagramSocket对象
socket = new DatagramSocket(3456);
//字节数组用于接收数据,客户端发送的数据不能超过100字节(按需自定义大小)
byte [] buf = new byte[100];
//初始化一个DatagramPacket对象
packet = new DatagramPacket(buf, buf.length);
//准备接收数据
socket.receive(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭socket对象
if(socket != null ){
socket.close();
}
}
}
//PS:作为服务器端不需要知道客户端的ip地址,相反,客户端需要知道服务器端的ip地址和服务器端指定某一端口号,客户端向该端口号发送数据时服务器端便能够接收到。
TCP:
TCP客户端
- 调用Socket() 创建一个套接字
- 调用Socket类的getOutputStream() 和 getInputStream()方法获取输出和输入流
- 关闭套接字
实例代码如下:
Socket socket;
InetAddress address = null;
try {
address = InetAddress.getByName("10.10.218.203");
int port = 2342;
//初始化Socket
socket = new Socket(address,port);
//获得输入流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输入内容
String inMsg = in.readLine();
//生成输出流
BufferedWriter out= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//向输出流写入内容
out.write("data from client");
//发送
out.flush();
//关闭连接
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//PS:作为客户端需要知道服务器端的IP地址和端口号.
TCP服务器端
- 调用ServerSocket(int port)创建一个ServerSocket,并指定端口
- 调用accept(),监听连接请求,如果客户端请求连接则接收连接,返回套接字
- 调用Socket类的getOutputStream()和getInputStream()获得输出流和输入流。
实例代码如下:
ServerSocket serverSocket;
Socket socket;
try {
//初始化ServerSocket对象
serverSocket= new ServerSocket(8765);
//监听连接请求
socket = serverSocket.accept();
//获得输入流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inMsg = in.readLine();
//获得输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//向输出流写入内容
out.write("data from tcp Server");
//发送
out.flush();
//关闭
socket.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
//判断是否初始化ServerSocket对象,如果初始化则关闭
if(serverSocket != null){
try{
serverSocket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
//PS:与客户端不同的是作为服务器端需要监听连接请求。