精华内容
下载资源
问答
  • udp协议实现
    千次阅读
    2022-02-20 09:47:23

    1、IP地址

    网络中的计算机使用IP地址来进行唯一标识,IP地址有IPv4和IPv6两种类型。IPv4采用十进制或二进制表示形式,十进制是一种比较常用的表示形式,如192.168.1.131,IPv6采用十六进制表示形式,一般不常用。

    如何查看IP地址相关信息:

    在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看。在Linux或Mac系统下,打开终端,使用ifconfig命令,按回车即可查看。

    2、端口号

    端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序。

    0 ~ 1024 为被系统使用或保留的端口号,0 ~ 65535为有效的端口号,也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范围内的整数数字。

    如何查看端口号的相关信息:

    在Windows系统下,打开cmd,输入命令netstat -an,按回车即可查看。

    3、通信协议

    TCP协议和UDP协议的区别。

    TCP协议
    英文名:Transmission Control Protocol
    中文名:传输控制协议
    协议说明:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    举例:打电话,需要双方都接通,才能进行对话

    特点:效率低,数据传输比较安全

    UDP协议
    英文名:User Datagram Protocol
    中文名:数据报协议
    协议说明:UDP是一种面向无连接的传输层通信协议。

    举例:发短信,不需要双方建立连接,数据报的大小应限制在64k以内

    特点:效率高,数据传输不安全,容易丢包

    编程

    send端:

    1. 创建套接字
        WORD wVersionRequested;
    	WSADATA wsaData;
    	wVersionRequested = MAKEWORD(1, 1);
    
    	int err = WSAStartup(wVersionRequested, &wsaData);//加载套接字库
    
    1. 创建Socket对象,并指定接收端应用程序的端口号和接收端主机的IP地址。
        SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字
    	SOCKADDR_IN addrSend;
    	addrSend.sin_addr.S_un.S_addr = inet_addr("192.168.0.195");//IP地址
    	addrSend.sin_family = AF_INET;
    	addrSend.sin_port = htons(6000);//端口号
    
    1. 调用sendto()向服务器发送指定数据。
    sendto(sockClient, "123", strlen("123") + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
    
    1. 关闭Socket对象。

    receive端

    1. 创建套接字
        WORD wVersionRequested;
    	WSADATA wsaData;
    	wVersionRequested = MAKEWORD(1, 1);
    
    	int err = WSAStartup(wVersionRequested, &wsaData);//加载套接字库
    	SOCKET sockRec = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字
    

    2.将套接字绑定到一个本地地址和端口

    	SOCKADDR_IN addrRec;
    	addrRec.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//IP地址
    	addrRec.sin_family = AF_INET;
    	addrRec.sin_port = htons(6000);//端口号
    	bind(sockSrv, (SOCKADDR*)&addrRec, sizeof(SOCKADDR));
    
    1. 调用recvfrom()向服务器发送指定数据。
    SOCKADDR_IN addrSen;//接收发送端的地址
    recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrSen, &len);
    
    1. 关闭Socket对象。

    Send.cpp

    #include <Winsock2.h>
    #include <stdio.h>
    #pragma comment(lib,"ws2_32.lib")
    
    void main()
    {
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	int err;
    
    	wVersionRequested = MAKEWORD(1, 1);
    
    	err = WSAStartup(wVersionRequested, &wsaData);
    	if (err != 0)
    	{
    		return;
    	}
    
    	if (LOBYTE(wsaData.wVersion) != 1 ||
    		HIBYTE(wsaData.wVersion) != 1)
    	{
    		WSACleanup();
    		return;
    	}
    	SOCKET sockSen = socket(AF_INET, SOCK_DGRAM, 0);
    	SOCKADDR_IN addrSen;
    	addrSen.sin_addr.S_un.S_addr = inet_addr("192.168.0.195");
    	addrSen.sin_family = AF_INET;
    	addrSen.sin_port = htons(6000);
    	
    	sendto(sockSen, "123", strlen("123") + 1, 0, (SOCKADDR*)&addrSen, sizeof(SOCKADDR));
    	closesocket(sockSen);
    	WSACleanup();
    }
    

    Receive.cpp

    #include <Winsock2.h>
    #include <stdio.h>
    #pragma comment(lib,"ws2_32.lib")
    
    void main()
    {
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	int err;
    
    	wVersionRequested = MAKEWORD(1, 1);
    
    	err = WSAStartup(wVersionRequested, &wsaData);
    	if (err != 0)
    	{
    		return;
    	}
    
    	if (LOBYTE(wsaData.wVersion) != 1 ||
    		HIBYTE(wsaData.wVersion) != 1)
    	{
    		WSACleanup();
    		return;
    	}
    
    	SOCKET sockRec = socket(AF_INET, SOCK_DGRAM, 0);
    	SOCKADDR_IN addrRec;
    	addrRec.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	addrRec.sin_family = AF_INET;
    	addrRec.sin_port = htons(6000);
    
    	bind(sockRec, (SOCKADDR*)&addrRec, sizeof(SOCKADDR));
    
    	SOCKADDR_IN addrSen;
    	int len = sizeof(SOCKADDR);
    	char recvBuf[100];
    	while (1)
    	{
    		recvfrom(sockRec, recvBuf, 100, 0, (SOCKADDR*)&addrSen, &len);
    		printf("%s\n", recvBuf);
    	}
    	closesocket(sockRec);
    	WSACleanup();
    }
    
    更多相关内容
  • 自己利用UDP协议编写的两个源代码,一个做客户端,一个做服务器,实现信息的传输,有利于帮助理解UDP协议
  • 一种基于UDP协议实现P2P智能穿越NAT的方案,范艳阳,刘若尧,由于目前NAT (Network Address Translation ,网络地址转换协议)的广泛运用,处于Internet上的公网主机与处于 NAT之后的主机建立对等连接是实现 P2P
  • 此例子可以实现,UDP协议实现局域网群发功能,有注释,直接可以用
  • uIP作为一种广泛使用的轻量级嵌入式TCP/IP协议栈,其UDP协议实现还不够完善,目前最新的1.0版本中仅实现了UDP客户端,尚没有实现UDP服务端。为此,对其进行了以下三方面的改进:UDP服务端口的初始化;接收到UDP...
  • 基于socket UDP协议实现文件传输(windows vc++源代码) UDP传1GB的文件仅需15秒 该代码包含 根据文件内容长度生成MD5码,以供校验文件完整性 本代码包含windows vc++编写dll的代码
  • UDP协议实现对等通讯Java+RSA加密解密传送信息实现,有client端和server端
  • socket套接字编程就是在网络程序中编写代码,通过一套套的接字接口实现网络程序的编写。 udp通信编程 在网络通信中有客户端和服务端,它们之间是如何通信的呢? 各端的操作流程: 服务端操作流程: 创建套接字...

    socket套接字编程就是在网络程序中编写代码,通过一套套的接字接口实现网络程序的编写。

    udp通信编程

    udp是无连接、不可靠、面向数据报的传输层协议。
    特点:支持多对多连接交互通信。尽最大努力交付,不保证可靠性,但速度最快
    在这里插入图片描述

    各端的操作流程:

    服务端操作流程:

    1. 创建套接字端口:在内核中创建socket结构体,关联进程与网卡之间的联系
    2. 为套接字绑定地址信息:网络通信中的数据都必须带有源端IP、源端端口、对端IP、对端端口、协议。在内核创建的socket结构体中描述IP地址端口以及协议,(必须主动绑定,告诉客户端自己的地址信息,如果不绑定客户端就不知道该发往哪个服务端了)为了告诉操作系统发往哪个IP地址,哪个端口的数据是交给我来处理的
    3. 接收数据:告诉操作系统发往哪个地址和端口的数据应该交给我处理,操作系统一旦接收到发往这个地址和端口的数据,就会将这条数据放到对应的socket的接收缓冲区中,然后服务端从对应的socket的接收缓冲区中取出数据。
    4. 发送数据:将数据写入内核中的socket发送缓冲区中,操作系统选择合适的时候将数据封装发送出去
    5. 关闭套接字:释放资源

    在这里插入图片描述

    客户端操作流程:第2,3步与服务端不同

    1. 创建套接字:在内核中创建socket结构体,关联进程与网卡之间的联系
    2. 为套接字绑定地址信息:描述在内核中创建的socket结构体的源端地址信息;发送的数据中源端地址信息就是绑定的地址信息(不推荐主动绑定地址,降低端口冲突的概率,从而确保数据发送的安全性)
    3. 发送数据:将数据放到socket的发送缓冲区中,操作系统选择合适时候封装数据并发送数据。若socket发送数据的时候还没绑定地址,则操作系统会选择合适的地址进行绑定。
    4. 接收数据:将数据写入内核中的socket发送缓冲区中,操作系统选择合适的时候将数据封装发送出去
    5. 关闭套接字:释放资源

    socket接口介绍

    1、创建套接字int socket(int domain, int type, int protocol) 参数内容(domian:地址域(本地通信-AF_LOCAL、IPv4-AF_INET、IPv6-AF_INET6等)确定本次socket通信使用哪种协议版本的地址结构,不同的协议版本有不同的地址结构;type:套接字类型(流式套接字-SOCK_STREAM、数据报套接字-SOCK_DGRAM等);protocol:协议类型(TCP-IPPROTO_TCP、UDP-IPPROTO_UDP) ,默认为0-流式默认TCP,数据报默认UDP)
    返回值:文件描述符-非负整数, 套接字所有其他接口的操作句柄,失败返回-1

    2、为套接字绑定地址信息int bind(int sockfd, struct sockaddr *addr, socklen_t len)参数内容(sockfd:创建套接字返回的操作句柄;addr:要绑定的地址信息;len:要绑定的地址信息长度)
    中间的参数结构体有很多种

    struct sockaddr
    {
    	sa_family_t sa_family;
    	char sa_data[14];
    };
    
    struct sockaddr_in
    {
    	sa_family sin_family;//地址域
    	in_port_t sin_port;//端口号
    	struct in_addr sin_addr;//IP地址
    };
    
    struct sockaddr_in6
    {
    	sa_family sin_family;//地址域
    	in_port_t sin6_port;//端口号
    	uint32_t sin6_flowinfo;
    	struct in6_addr, sin6_addr;//IP地址
    	unit32_t sin6_scope_id;
    }
    
    struct sockaddr_un
    {
    	__SOCKADDR_COMMON (sun_);
    	char sun_path[108];
    };
    

    在这里插入图片描述

    不同的地址结构,有统一的一个信息:前两个字节是地址域类型,bind可以绑定不同的地址结构,为了实现接口统一,因此用户定义地址结构的时候,需要定义自己需要的地址结构,例如IPv4就使用struct sockaddr_in,但是进行绑定的时候,统一类型强转成为sockaddr*类型
    简单解析bind接口的实现

    bind(fd,addr, len)
    {
    	if(addr->sa_family==AF_INET)
    	{
    		//绑定IPv4地址信息,这个结构体按照sockaddr_in进行解析
    	}
    	else if (addr->sa_family==AF_INET6)
    	{
    		//绑定IPv6地址信息,这个结构体按照sockaddr_in6进行解析
    	}
    	else if ...
    }
    

    3、接收数据,接收发送者地址便于回复ssize_t recvfrom(int sockfd, char *buf, int len, int flag, struct sockaddr *peer_addr, socklen *addrlen) 参数内容(sockfd:创建套接字返回的操作句柄;buf:一块缓冲区,用于接收从接收缓冲区中取出数据;len:想要接收的数据长度;flag:操作选项标志,默认为0,表示阻塞操作;peer_addr:发送方的地址信息;addrlen:想要获取的地址信息长度以及返回实际长度)
    返回值:成功返回实际接收到的数据字节长度,失败返回-1

    4、发送数据ssize_t sendto(int sockfd, char *data, int len, int flag, struct sickaddr *peer_addr, socklen_t addrlen) 参数内容(socket:socket操作句柄;data:要发送的数据地址;len:要发送数据长度;flag:默认为0,表示阻塞操作;peer_addr:接收方的地址信息;addrlen:地址信息长度)
    返回值:成功返回实际发送的数据字节长度,失败返回-1

    5、关闭套接字int close(int fd)

    网络字节序的转换接口
    uint32_t htonl(uint32_t hostlong) 主机字节序到网络字节序的转换
    uint16_t htons(uint16_t hostshort)
    uint32_t ntohl(uint32_t netlong)网络字节序到主机字节序的转换
    uint16_t ntohs(uint16_t netshort)

    in_addr_t inet_addr(const char *cp)将字符串的点分十进制IP地址转换成为网络字节序的整数IP地址
    char *inet_ntoa(struct in_addr in)将网络字节序的整数IP地址转化为字符串点分十进制IP地址
    const char *inet_ntop(int af, const void *src,char *dst, socklen_t size)将网络字节序的整数IP地址转化为字符串IP地址-兼容IPv4和IPv6
    int inet_pton(int af, const char *src, void *dst)将字符串的IP地址转换成为网络字节序的整数IP地址-兼容IPv4和IPv6

    udp客户服务端代码实现

    使用c++封装UdpSocket类,实例化的每一个对象都是一个udp通信套接字,并且能够通过成员接口实现udp通信流程
    udpsocket.hpp

    //udpsocket.hpp
    #include <cstdio>
    #include <string>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    using namespace std;
    class UdpSocket
    {
    	public:
    		UdpSocket()
    			:_sockfd(-1)
    		{}
    		//创建套接字
    		bool Socket()
    		{
    			_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    			if (_sockfd < 0)
    			{
    				perror("socket error");
    				return false;
    			}
    			return true;
    		}
    		//为套接字绑定地址信息
    		bool Bind(const string &ip, uint16_t port)
    		{
    			//定义IPv4地址结构体
    			struct sockaddr_in addr;
    			//地址信息赋值
    			addr.sin_family = AF_INET;
    			addr.sin_port = htons(port);//将主机字节序短整型型数据转化为网络字节序数据
    			addr.sin_addr.s_addr = inet_addr(ip.c_str());//将字符串IP地址转化为网络字节序IP地址
    			socklen_t len = sizeof(struct sockaddr_in);
    			int ret = bind(_sockfd, (struct sockaddr*)&addr, len);
    			if (ret < 0)
    			{
    				perror("bind error");
    				return false;
    			}
    			return true;
    		}
    		//接收数据,获取发送端地址信息
    		bool Recv(string *buf, string *ip=NULL, uint16_t *port=NULL)
    		{
    			struct sockaddr_in peer_addr;//用于接收发送端的地址信息
    			socklen_t len = sizeof(struct sockaddr_in);
    			char tmp[4096] = {0};
    			int ret = recvfrom(_sockfd, tmp, 4096, 0, (struct sockaddr*)&peer_addr, &len);
    			if (ret < 0)
    			{
    				perror("recvfrom error");
    				return false;
    			}
    			buf->assign(tmp, ret);//assign从指定字符串中截取指定长度的数据到buf中
    			if (port != NULL)
    			{
    				*port = ntohs(peer_addr.sin_port);//网络字节序到主机字节序的转换
    			}
    			if (ip != NULL)
    			{
    				*ip = inet_ntoa(peer_addr.sin_addr);//网络字节序到字符串IP地址的转换
    			}
    			return true;
    		}
    		//发送数据
    		bool Send(const string &data, string &ip, const uint16_t port)
    		{
    			struct sockaddr_in addr;
    			addr.sin_family = AF_INET;
    			addr.sin_port = htons(port);
    			addr.sin_addr.s_addr = inet_addr(ip.c_str());
    			socklen_t len = sizeof(struct sockaddr_in);
    			int ret = sendto(_sockfd, data.c_str(), data.size(), 0, (struct sockaddr*)&addr, len);
    			if (ret < 0)
    			{
    				perror("sendto error");
    				return false;
    			}
    			return true;
    		}
    		//关闭套接字
    		bool Close()
    		{
    			if (_sockfd > 0)
    			{
    				close(_sockfd);
    				_sockfd = -1;
    			}
    			return true;
    		}
    	private:
    		int _sockfd;
    };
    
    

    udp_srv.cpp

    #include <iostream>
    #include <string>
    #include "udpsocket.hpp"
    using namespace std;
    
    #define CHECK_RET(q) if((q)==false){return false;}
    int main(int argc, char *argv[])
    {
    	//运行时有三个参数 udp_src 192.168.73.29 4096
    	if (argc != 3)
    	{
    		cout << "Usage: ./udp_srv ip prot\n";
    		return -1;
    	}
    	uint16_t port = stoi(argv[2]);
    	string ip = argv[1];
    	UdpSocket srv_sock;
    	//创建套接字
    	CHECK_RET(srv_sock.Socket());
    	//绑定地址信息
    	CHECK_RET(srv_sock.Bind(ip, port));
    	while(1)
    	{
    		//接收数据
    		string buf;
    		string peer_ip;
    		uint16_t peer_port;
    		CHECK_RET(srv_sock.Recv(&buf, &peer_ip, &peer_port));
    		cout << "client["<<peer_ip<<":"<<peer_port<<"] say: " << buf << endl;
    		//发送数据
    		buf.clear();
    		cout << "server say: ";
    		cin >> buf;
    		CHECK_RET(srv_sock.Send(buf, peer_ip, peer_port));
    	}
    	//关闭套接字
    	srv_sock.Close();
    	return 0;
    }
    
    

    udp_cli.cpp

    #include <iostream>
    #include <string>
    #include "udpsocket.hpp"
    using namespace std;
    
    #define CHECK_RET(q) if((q)==false){return -1;}
     main(int argc, char *argv[])
    {
    	if (argc != 3)
    	{
    		cout << "Usage: ./udpcli ip port\n";
    		return -1;
    	}
    	string srv_ip = argv[1];
    	uint16_t srv_port = stoi(argv[2]);
    
    	UdpSocket cli_sock;
    	//创建套接字
    	CHECK_RET(cli_sock.Socket());
    	//绑定数据(不推荐)
    	while(1)
    	{
    		//发送数据
    		cout << "client say:";
    		string buf;
    		cin >> buf;
    		CHECK_RET(cli_sock.Send(buf, srv_ip, srv_port));
    		//接收数据
    		buf.clear();
    		CHECK_RET(cli_sock.Recv(&buf));
    		cout << "server say: " << buf << endl;
    	}
    	//关闭套接字
    	cli_sock.Close();
    	return 0;
    }
    

    makefile

    all:udp_srv udp_cli
    udp_srv:udp_srv.cpp
    	g++ -std=c++11 $^ -o $@
    udp_cli:udp_cli.cpp
    	g++ -std=c++11 $^ -o $@
    
    

    运行结果:
    通过ifconfig命令查看网卡信息
    在这里插入图片描述
    先运行服务端(ip地址必须为网卡信息中的IP地址)
    在这里插入图片描述
    再运行客户端,并对指定服务端发送数据
    在这里插入图片描述
    服务端收到数据并回复
    在这里插入图片描述
    客户端也收到数据
    在这里插入图片描述
    netstat-查看网络状态信息
    -a表示查看所有网络信息
    -n表示查看原始ip地址信息
    -p表示查看网络状态对应的进程
    -t表示查看tcp的信息
    -u表示查看udp的信息

    推荐阅读

    网络 TCP协议(C++代码|通过tcp协议实现客户端与服务端之间的通信)

    展开全文
  • 该文档将uip协议栈中,UDP的实现进行了补充,将实现UDP协议,多端口问题。
  • UDP协议实现ICMP协议中的Ping报文

    千次阅读 2020-06-03 19:28:23
    采用UDP协议实现ICMP协议中的Ping报文功能,就必须在应用层来模拟网格层中的Ping报文的工作流程,即首先由客户机向服务器段发送一个应用层的UDP Ping请求报文,在服务器段程序接收到UDP Ping请求报文后,就会向...

    原理:

    采用UDP协议来实现ICMP协议中的Ping报文功能,就必须在应用层来模拟网格层中的Ping报文的工作流程,即首先由客户机向服务器段发送一个应用层的UDP Ping请求报文,在服务器段程序接收到UDP Ping请求报文后,就会向客户机返回一个UDP Ping响应报文。客户机通过判断程序中收到的报文及其相关的信息可以判断链路状况。

    流程图:

    在这里插入图片

    编写服务器段程序

    功能:

    1.根据用户输入参数打开特定的插口,并对插口进行监听,
    2.接受从客户机发送过来的应用层Ping请求报文并打印
    3.向客户机回复Ping响应报文

    import java.io.*;
    import java.net.*;
    import java.nio.channels.NonWritableChannelException;
    import java.util.*;
    public class PingServer {
    	private static final double LOSS_RATE=0.3;
    	private static final int AVERAGE_DELAY=100;
    	public static void main(String[] args)throws Exception {
    		if(args.length!=1) {
    			System.out.println("Required arguments:port");
    			return;
    		}
    		int port = Integer.parseInt(args[0]);
    		Random random = new Random();
    		DatagramSocket socket = new DatagramSocket(port);
    		while(true) {
    			DatagramPacket requset=new DatagramPacket(new byte[1024], 1024);
    			socket.receive(requset);
    			printData(requset);
    			if(random.nextDouble()<LOSS_RATE) {
    				System.out.println("Reply not sent");
    				continue;
    			}
    			Thread.sleep((int)(random.nextDouble()*2*AVERAGE_DELAY));
    			InetAddress clientHost=requset.getAddress();
    			int clientPort = requset.getPort();
    			byte[] buf = requset.getData();
    			DatagramPacket reply= new DatagramPacket(buf, buf.length,clientHost,clientPort);
    			socket.send(reply);
    			System.out.println("Reply sent");
    		}
    	}
    	private static void printData(DatagramPacket requset) throws Exception {
    		// TODO Auto-generated method stub
    		byte[] buf = requset.getData();
    		ByteArrayInputStream bais=new ByteArrayInputStream(buf);
    		InputStreamReader isr= new InputStreamReader(bais);
    		BufferedReader br=new BufferedReader(isr);
    		String line = br.readLine();
    		System.out.println("Received from"+ requset.getAddress().getHostAddress()+"."+new String(line));
    	}
    }
    

    编写客户机程序

    功能

    1.与服务器建立连接构建UDP Ping请求报文
    2.将请求报文发送给服务器 同时等待和接收服务器发回的响应报文,连续发10次Ping命令后关闭插口

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class PingClient {
    	public static void main(String[] args)throws Exception {
    		if(args.length==0) {
    			System.out.println("Required argument:Host port");
    			return;
    		}
    		if(args.length==1) {
    			System.out.println("Required argument: port");
    			return;
    		}
    		String host=args[0].toString();
    		int port = Integer.parseInt(args[1]);
    		DatagramSocket clientSocket = new DatagramSocket();
    		clientSocket.setSoTimeout(1000);
    		InetAddress IPAddress=InetAddress.getByName(host);
    		long sendTime,receiveTime;
    		for(int i=0;i<10;i++) {
    			byte[] sendData=new byte[1024];
    			byte[] receviceData=new byte[1024];
    			Date currentTime=new Date();
    			SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    			String timeStamp= formatter.format(currentTime);
    			String pingMessage= "Ping"+"i"+""+timeStamp+""+"\r\n";
    			sendData = pingMessage.getBytes();
    			DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,IPAddress,port);
    			try {
    				sendTime = System.currentTimeMillis();
    				clientSocket.send(sendPacket);
    				DatagramPacket receivePacket = new DatagramPacket(receviceData, receviceData.length);
    				clientSocket.receive(receivePacket);
    				receiveTime =System.currentTimeMillis();
    				long latency= receiveTime-sendTime;
    				String serverAddress= receivePacket.getAddress().getHostAddress();
    				System.out.println("From"+serverAddress + ":"+latency+"ms.");
    			}catch(java.net.SocketTimeoutException ex){
    				String reply="No reply";
    				System.out.println(reply);
    			}
    		}
    		clientSocket.close();
    	}
    }
    
    效果复现:

    找到对应java文件的编译文件,进入PowerShell使用CMD命令执行对应语句:
    首先开发一个端口号80
    在这里插入图片描述
    然后再开一个PowerShell窗口执行ServerClient.java 127.0.0.1 80
    在这里插入图片描述
    此时服务器部分:
    在这里插入图片描述
    大功告成!!!!!!

    展开全文
  • UDP协议实现NAT穿透

    2015-01-09 21:37:11
    java使用UDP穿透NAT.rar,TestP2P-UDP,bin,进度.txt,xwz,p2p,upd,client,MainClient.class,HeartThread.class,server,MainServer.class,util,StringUtil.class,ConnectionClientInfo.class,MyProtocol.class,src,进度...
  • 基于UDP的聊天工作室
  • 可以实现多人聊天!在局域网内可用!自动获取计算机名,只要进入登录界面就可运行!
  • 但TCP/IP协议的传输速度方面没有面向非连接的UDP协议高,因此基于UDP的研究成了网络传输协议研究的重要方向之一。UDP的主要特点是高速、乱序、丢包较多、面向非连接、系统开销少等特点,针对这些特点并进行分析后...
  • Python 基于TCP与UDP协议实现socket通信的简单代码实现

    千次阅读 多人点赞 2019-04-07 12:30:03
    以下为基于UDP协议实现的socket简单代码: server端代码: client端代码: 基于UDP协议可以随便先启动server或者client server收到数据: client端收到数据: 至此,基于UDP的socket...

         Python最近的热度可谓是水涨船高,在网上随便搜一搜编程语,除了老牌霸榜的JAVA以外,Python的排名也是水涨船高。虽然编程语言这种东西不应该有排名一说,适合自己的适合项目开发的就是最好的语言,但是Python最近的热度确实只增不减。作为一个python不算很厉害的小白,跟大家分享分享我觉得Python学习中还算重要的内容,不定期更新,记录下学习Python过程中的点点滴滴,也希望能给大家一些帮助。

         Socket的含义:(摘自百度)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

    建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

    Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

    说白了,在网络上的任意两台计算机进行通信,不管用的是什么协议,底层都是用Socket(套接字)连接。

    下面就是Python通过TCP协议实现的socket简单代码:

    程序分为server.py服务端与client.py客户端:

    server端代码

    client端代码

    一定要先运行server端!!!!!!再运行client端

    server端接收到client端发送的“hi server”数据

    client端接收到server发送的“hello client”数据

    注意:基于TCP协议的socket连接会出现黏包现象,黏包现象的解决问题之后会有分析。

    至此,简单的基于TCP协议的socket代码实现

     

    以下为基于UDP协议实现的socket简单代码:

    server端代码:

    client端代码:

    基于UDP协议可以随便先启动server或者client

    server收到数据:

    client端收到数据:

    至此,基于UDP的socket连接代码实现。

    展开全文
  • 利用UDP协议与socket文件完成两个进程之间的网络通信,这里分为服务端与客户端,服务端则是在云端运行的服务器进程,客户端则为计算机本地运行的进程。注意端口号要一致。
  • UDP协议实现简单的多人群聊通讯,源码,直接打开EXE文件在两台以及以上电脑上就可以实现通讯
  • 基于UDP协议的聊天室,linux下开发完成,在控制台下运行。
  • UDP协议实现网络通信

    2011-07-02 15:24:25
    关于VC++实现UDP协议网络通信,用到VC++还有数据库
  • C#实现 UDP 通信(UDP 协议)本篇文章主要介绍了C#的Socket实现UDP协议通信示例代码,
  • Netty之UDP协议实现数据接收

    千次阅读 2020-11-20 16:47:39
    UDP协议的介绍: 我就不多说了,参考 百度百科 跟我个人理解,需要注意的是: 1、UDP的有效端口范围在0-65535之间,大约49151的端口都代表动态端口 2、UDP是一种无连接的,不可靠的传输层协议 接下来就是...
  • 可靠UDP协议栈的FPGA实现
  • UDP协议实现广播通信OR单播通信 在 visual studio 下 调试通过
  • 众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层。与TCP协议同层,都是提供信息的传输服务,但与TCP最大区别就是,它是一种无连接不可靠的信息传输。 什么是无连接不可靠?直白点讲就是,...
  • UDP协议下的传输,服务器和客户端之间的传输。
  • C++ Builder编写的用UDP协议实现远程监视屏幕,UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它...
  • FPGA实现UDP协议栈,verilog语言附带说明,测试激励以及测试工具
  • 为了简化设计提高运行效率,这里UDP没有实现CHECK SUM。 代码编译通过,接下来要进行仿真,死磕时序,可能今晚有时间搞搞。 module pack_udp_ip_tb ; reg clk = 0 , rst = 1 ; always #5 clk = ~clk ; ...
  • 总结基于C#的UDP协议的同步通信。VisualStudio2010UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述。由于UDP是一种无连接的协议。因此,为了使服务器应用能够发送和接收UDP数据包,则需要做两件事情:...
  • Verilog实现FPGA千兆以太网通讯,udp/ip协议,Wireshark抓包,亲测可用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,133
精华内容 100,053
关键字:

udp协议实现