您的位置:首页 > 编程语言 > Java开发

java 之UDP编程

2016-02-16 14:54 471 查看
大白话:每一台电脑都有自己的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);这两句就完成了,第一句设定了发送端的通信端口,第二句,发送数据

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

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

好那么我先写一个数据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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: