java 之UDP编程

大白话:每一台电脑都有自己的ip地址,向指定的ip地址发数据,数据就发送到了指定的电脑。UDP通信只是一种通信方式而已,其特点就不多说。有了ip地址数据就能发送到指定的电脑了,但是呢!我把数据发送到电脑了,电脑中的哪个程序接收呢。不知道亲们知不知道,其实每一个网络软件都有自己的通信端口,像qq,酷狗音乐的下载端口等等。现在知道了吧,向指定的ip地址和指定的端口发数据,才能发送到指定的程序上(当然是我们自己做的程序)。

我们要做两个程序发送端和接收端,先做发送端吧

java提供了专门用于UDP通信的类DatagramSocket;该类有DatagramSocket(int port)的构造方法---可以设定该程序通信的的端口(就像上面说的有ip了还需要端口,这是设定该程序的通信端口);该类提供了发送数据包的方法send(DatagramPacket p),接收数据包的方法receive(DatagramPacket p)

那么DatagramSocket sendDatagramSocket = new DatagramSocket(10000);

sendDatagramSocket .send(DatagramPacket p);这两句就完成了,第一句设定了发送端的通信端口,第二句,发送数据

就缺一点发送到哪里!!往下看

为什么叫数据包呢!上面不是说了,要想通信成功必须向指定的ip地址和指定的端口发数据,发送的时候数据被打包了,里面包含了要发送到的ip地址,端口,和想发的数据(被打包了),注意send(DatagramPacket p)里面的DatagramPacket p,你查一下java的中文api帮助文档就会知道DatagramPacket是一个类,他有一个构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 文档中的解释----构造数据报包,用来将长度为 length 的包发送到指定主机(指定ip地址)上的指定端口号;第一个参数byte[] buf发送的数据,类型为byte[],第二个参数int length,发送数据的长度,第三个InetAddress address发送的ip地址,类型为InetAddress ,第四个端口号。

好那么我先写一个数据String string = "yangfengwu";然后转化一下byte[] by = string.getBytes();意思是转化成字符数组

相当于byte[] by ={‘y‘,‘a‘,‘n‘,‘g‘,‘f‘,‘e‘,‘n‘,‘g‘,‘w‘,‘u‘};不要嫌麻烦,这样写好处大大的有,如果做界面开发,文本框中我们所传的数据都是字符串类型的!!

好接着DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),8080);

好说一下这个InetAddress.getByName("192.168.32.1")。InetAddress是一个java中的类,他就是专门操作ip的,列如

InetAddress i = InetAddress.getLocalHost();

System.out.println(i.toString());这两句就可以打印出本机的名称和ip地址

我们用getByName(String host)该方法的作用----在给定主机名的情况下确定主机的 IP 地址。

主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。

InetAddress ip = InetAddress.getByName("192.168.32.1");

DatagramPacket sendPscket = new DatagramPacket(by, by.length, ip ,8080);
sendDatagramSocket .send(DatagramPacket p);     发送  sendDatagramSocket .send(sendPscket );

下面是完整的发送端程序

package server;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Server_test {
public static void main(String[] str)
{
try
{
//创建DatagramSocket 对象,并指定该程序的通信端口为10000
DatagramSocket sendDatagramSocket = new DatagramSocket(10000);
//确定要发送的消息
String string = "yangfengwu";
//转成字符数组类型
byte[] by = string.getBytes();
//确定要发送的地址
//InetAddress ip = InetAddress.getLocalHost();//如果是自己电脑测试可以这样得到本机地址,也可以自己查自己的ip地址

//InetAddress ip = InetAddress.getByName("192.168.32.1");

//确定要发送的端口
int port = 8080;
//创建发送类型的数据包,这个数据包包含了要发往的ip地址和端口
DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),port);
//通过DatagramSocket 的send方法发送数据
sendDatagramSocket.send(sendPscket);
//创建接收缓冲区
byte[] bt = new byte[1024];
//创建接收类型的数据包

//DatagramPacket(byte[] buf, int length)构造 DatagramPacket,用来接收长度为
length 的数据包

DatagramPacket receivePacket = new DatagramPacket(bt, bt.length);
//通过DatagramSocket 的receive方法发送数据
sendDatagramSocket.receive(receivePacket);
//打印---数据包
String daString = new
String(receivePacket.getData(),0,receivePacket.getLength());//getData()方法是返回数据缓冲区
System.out.println(daString);
//关闭接收
sendDatagramSocket.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

下面是完整的接收端程序

package client;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client_test {
public static void main(String[] str)
{
try
{
//确定端口
int port = 8080;
//创建DatagramSocket 对象,并指定该程序的通信端口为8080
DatagramSocket receiveSocket = new DatagramSocket(port);
while(true)
{
//创建接收缓冲区
byte[] by = new byte[1024];
//创建接收数据包
DatagramPacket receivePacket = new DatagramPacket(by, by.length);
//接收数据
receiveSocket.receive(receivePacket);
//解析消息并打印数据
String string =new String(receivePacket.getData(),0,receivePacket.getLength());
System.out.println(string);
//通过数据包也可以解析ip、和端口,打印
InetAddress ipAddress = receivePacket.getAddress();
int receivePort = receivePacket.getPort();
System.out.println(ipAddress);
System.out.println(receivePort);
//发送数据
String aaString = "123";
byte[] bb = aaString.getBytes();
//创建发送类型的数据包
DatagramPacket sendPscket = new DatagramPacket(bb, bb.length,InetAddress.getByName("192.168.32.1"), 10000);
receiveSocket.send(sendPscket);
}

//receiveSocket.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

时间: 2024-10-16 11:00:46

java 之UDP编程的相关文章

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

Java笔记二十三.网络编程基础与UDP编程

网络编程基础与UDP编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.网络编程基础 1.TCP/IP协议:TCP/IP协议是一个非常实用的网络应用程序通信协议,包括TCP(传输控制协议)和IP地址(计算机唯一标识号). 2.IP地址:IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证),通过这个标识号来指定接收数据的计算机和识别发送数据的计算机,该标识号即为IP地址. (1)Ipv4:指在计算机中IP地址用4个字节(

java使用UDP

Java中通信可以使用的协议包括TCP协议和UDP协议 UDP协议概念 UDP协议的全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,但它是一种无连接的协议.在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的. 综上所述:UDP不提供可靠地保证,保证数据准确按序到达目的地 为什么要使用UDP 在选择使用协议的时候,选择UDP必须要谨慎?在网络质量令人不十分满

JAVA的面向对象编程--------课堂笔记

JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.   为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参

JAVA的网络编程【转】

网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

JAVA的网络编程

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

JAVA的面向对象编程

面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象. 为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参数,也可能有返回值. 注意区分:对象(本身).对象的实现者.

Java Socket 网络编程心跳设计概念

Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.一般是用来判断对方(设备,进程或其它 网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.基本原因是服务 器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况.