? ? ?UDP簡介
UDP: User Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)包協(xié)議,是 OSI 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。
特點(diǎn):每個(gè)數(shù)據(jù)報(bào)中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接。
UDP傳輸數(shù)據(jù)時(shí)是有大小限制的,每個(gè)被傳輸?shù)臄?shù)據(jù)報(bào)必須限定在64KB之內(nèi)。
UDP是一個(gè)不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報(bào)并不一定以相同的次序到達(dá)接收方。
? ? ?udp socket實(shí)現(xiàn)數(shù)據(jù)傳輸
socket編程實(shí)現(xiàn)UDP數(shù)據(jù)傳輸基于DatagramSocket與DatagramPacketAPI實(shí)現(xiàn)。
[java] view plain copyimport java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客戶端發(fā)送數(shù)據(jù)
*/
public class UdpClient {
public static void main(String[] args) throws IOException {
// 1.定義服務(wù)器的地址、端口號(hào)、數(shù)據(jù)
byte[] data = “udpclient發(fā)送數(shù)據(jù)”.getBytes();
InetAddress address = InetAddress.getByName(“l(fā)ocalhost”);
int port = 8086;
// 2.創(chuàng)建數(shù)據(jù)報(bào),包含發(fā)送的數(shù)據(jù)信息
DatagramPacket packet = new DatagramPacket(data, data.length, address,port);
// 3.創(chuàng)建DatagramSocket對(duì)象
DatagramSocket socket = new DatagramSocket();
// 4.向服務(wù)器端發(fā)送數(shù)據(jù)報(bào)
socket.send(packet);
socket.close();
}
}
[java] view plain copyimport java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
*服務(wù)器接收數(shù)據(jù)
*/
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接收數(shù)據(jù)是” + info);
socket.close();
}
}
關(guān)于socket的配置:
1、創(chuàng)建sokcet套接字
2、為創(chuàng)建的socket綁定地址與端口,指定傳輸?shù)膮f(xié)議,一般采用AF_INET,數(shù)據(jù)的傳輸格式一般為(SOCK_STREAM、SOCK_DGRAM)
3、打開文件標(biāo)識(shí)符,并開始發(fā)送數(shù)據(jù)
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、設(shè)置客戶端socket參數(shù)
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//3、設(shè)置傳輸協(xié)議、端口以及目的地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
//4、創(chuàng)建發(fā)送與接收緩存字節(jié)數(shù)組
int ret;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
//5、開始發(fā)送數(shù)據(jù)(此處是發(fā)送來自標(biāo)準(zhǔn)輸入的數(shù)據(jù))
while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){
sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
//6、開始接收數(shù)據(jù),接收服務(wù)端返回的數(shù)據(jù)
ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);
if(ret == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}
//fputs(recvbuf, stdout); //將服務(wù)端返回的數(shù)據(jù)寫入到標(biāo)準(zhǔn)輸出
//7、清空發(fā)送與接收緩存
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
//8、關(guān)閉socket流
close(sock);
}
int main(void){
int sock;
//1.創(chuàng)建客戶端的socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket”);
exit(EXIT_FAILURE);
}
client(sock);
return 0;
}
UDP服務(wù)端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、建立接收緩存字節(jié)數(shù)組
char recvbuf[1024] = {0};
//2、定義socket
struct sockaddr_in peeraddr;
socklen_t peerlen;
int n;
while(1){
//
peerlen = sizeof(peeraddr);
//3、清空接收緩存數(shù)組
memset(recvbuf, 0, sizeof(recvbuf));
//4、開始接收數(shù)據(jù)
n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);
//5、判斷是否接收完整數(shù)據(jù)
if(n == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}else if(n 》 0){
//6、成功接收數(shù)據(jù),將緩存數(shù)據(jù)寫入到標(biāo)準(zhǔn)輸出,打印到控制臺(tái)
fputs(recvbuf, stdout);
//7、想客戶端回送接收到的數(shù)據(jù)(回顯客戶端輸入的數(shù)據(jù))
sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);
}
}
//關(guān)閉socket
close(sock);
}
int main(void){
int sock;
//創(chuàng)建服務(wù)器socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket error”);
exit(EXIT_FAILURE);
}
//設(shè)置服務(wù)器socket參數(shù)
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//設(shè)置socket的協(xié)議、端口以及地址
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;
}
評(píng)論
查看更多