网络/协议
UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
特点:每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
socket编程实现UDP数据传输基于DatagramSocket与DatagramPacketAPI实现。
[java] view plain copy
[java] view plain copyimport java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客户端发送数据
*/
public class UdpClient {
public static void main(String[] args) throws IOException {
// 1.定义服务器的地址、端口号、数据
byte[] data = “udpclient发送数据”.getBytes();
InetAddress address = InetAddress.getByName(“localhost”);
int port = 8086;
// 2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address,port);
// 3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 4.向服务器端发送数据报
socket.send(packet);
socket.close();
}
}
[java] view plain copyimport java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
*服务器接收数据
*/
public class UdpServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8086);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
String info = new String(data, 0, packet.getLength());
System.out.println(“udpservice接收数据是” + info);
socket.close();
}
}
1、创建sokcet套接字
2、为创建的socket绑定地址与端口,指定传输的协议,一般采用AF_INET,数据的传输格式一般为(SOCK_STREAM、SOCK_DGRAM)
3、打开文件标识符,并开始发送数据
udp客户端CODE:
[cpp] view plain copy《pre name=“code” class=“html”》#include 《unistd.h》
#include 《sys/types.h》
#include 《netinet/in.h》
#include 《arpa/inet.h》
#include 《stdlib.h》
#include 《stdio.h》
#include 《errno.h》
#include 《string.h》
void client(int sock){
//2、设置客户端socket参数
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//3、设置传输协议、端口以及目的地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
//4、创建发送与接收缓存字节数组
int ret;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
//5、开始发送数据(此处是发送来自标准输入的数据)
while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){
sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
//6、开始接收数据,接收服务端返回的数据
ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);
if(ret == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}
//fputs(recvbuf, stdout); //将服务端返回的数据写入到标准输出
//7、清空发送与接收缓存
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
//8、关闭socket流
close(sock);
}
int main(void){
int sock;
//1.创建客户端的socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket”);
exit(EXIT_FAILURE);
}
client(sock);
return 0;
}
UDP服务端CODE:
[cpp] view plain copy#include 《stdio.h》
#include 《stdlib.h》
#include 《unistd.h》
#include 《errno.h》
#include 《sys/types.h》
#include 《sys/socket.h》
#include 《netinet/in.h》
#include 《string.h》
void server(int sock){
//1、建立接收缓存字节数组
char recvbuf[1024] = {0};
//2、定义socket
struct sockaddr_in peeraddr;
socklen_t peerlen;
int n;
while(1){
//
peerlen = sizeof(peeraddr);
//3、清空接收缓存数组
memset(recvbuf, 0, sizeof(recvbuf));
//4、开始接收数据
n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);
//5、判断是否接收完整数据
if(n == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}else if(n 》 0){
//6、成功接收数据,将缓存数据写入到标准输出,打印到控制台
fputs(recvbuf, stdout);
//7、想客户端回送接收到的数据(回显客户端输入的数据)
sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);
}
}
//关闭socket
close(sock);
}
int main(void){
int sock;
//创建服务器socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket error”);
exit(EXIT_FAILURE);
}
//设置服务器socket参数
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//设置socket的协议、端口以及地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//将socket绑定地址
if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) 《 0){
perror(“bind error”);
exit(EXIT_FAILURE);
}
server(sock);
return 0;
}
全部0条评论
快来发表一下你的评论吧 !