您的位置:首页 > 职场人生

UDP传输

2014-03-13 13:51 435 查看
------ android培训java培训,期待与您交流
------
 黑马程序员 UDP传输

网络编程:

IP地址:网络中设备的标识,不易记忆,可用主机名,本地地址用主机名表示就是 localhost。

端口:我们这里说的端口,是逻辑端口,数据要发送到对方指定的应用程序上,为了表示这些应用程序,所以给这些网络应用程序都 进行了数字标识,为了方便称呼这个数字,我们叫做端口。如Oracle默认端口是1521。

有效端口:0-65535,其中0-1024系统使用或保留端口。

传输协议:通讯的规则,常见的是UDP TCP

IP对象:InetAddress.

API中提供的常用方法:

static InetAddress getLocalHost()  返回本地主机,本地主机的 IP 地址。

String getHostAddress()  返回 IP 地址字符串(以文本表现形式)。 

String getHostName()  获取此 IP 地址的主机名。 

获取任意主机的IP地址对象:

static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 

import java.net.*;

class  IPDemo{
public static void main(String[] args) throws UnknownHostException{
InetAddress ip = InetAddress.getByName("www.baidu.com");
System.out.println("addr:"+ip.getHostAddress());
System.out.println("name:"+ip.getHostName());
}

}

UDP与TCP传输的特点:

UDP面向无连接,传输数据有限,限制在64k,是不可靠协议,效率较高

TCP则是面向有连接,是通过三次握手建立起连接,能传输大量数据,由于需先建立连接,效率会稍低

Socket:套接字,通信的端点,此类实现客户端套接字,套接字是两台机器间通信的端点,其实相当于一个网络应用程序。 

是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

UDP传输:

1,只要是网络传输,必须有socket。

2,数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。

UDP传输中涉及的相关类:

类 DatagramSocket,此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点。

构造方法:DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。

方法摘要:void send(DatagramPacket p)    从此套接字发送数据报包。DatagramPacket 包含的信息指示: 将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。

方法摘要:void receive(DatagramPacket p) 从此套接字接收数据报包。此方法在接收到数据报前一直阻塞,当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。

类 DatagramPacket,此类表示数据报包。 

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器,不对包投递做出保证。 

构造方法:DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

         构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length) 

         构造 DatagramPacket,用来接收长度为 length 的数据包。

方法摘要: InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 
 int getPort()  返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 
 byte[] getData()  返回数据缓冲区。这个缓冲区接收的是发送端打包过来的数据,包括纯数据,IP,端口等信息
   而发送端的作为Datagram构造函数参数传入的缓冲数组里面存的只是纯数据,这是两者区别

udp的发送端:

1,建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。

2,明确要发送的具体数据,数据要是字节。

3,将数据封装成了数据包,包括指定的主机端口。

4,用socket服务的send方法将数据包发送出去。

5,关闭资源。

package udp;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import org.junit.Test;

public class UdpSendDemo {
@Test
public void testSend() throws Exception{
//创建socket服务,指定数据发送端口
DatagramSocket ds=new DatagramSocket();
//创建缓冲区接收数据
byte[] buf="nihao".getBytes();
//将数据封装进数据包,并指定要发送到的主机,端口
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("sun"),10008);
//发送数据
ds.send(dp);
//关闭资源
ds.close();
}

}

udp的接收端:

1,创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。

2,定义数据包,用于存储接收到数据。

3,通过socket服务的接收方法将收到的数据存储到数据包中。

4,通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。

5,关闭资源。

package udp;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import org.junit.Test;

public class UdpRecDemo {
@Test
public  void testReceive() throws Exception {
//创建socket服务,指定监听的端口
DatagramSocket ds= new DatagramSocket(10008);
//创建数据包,准备缓冲区接收从发送端发来的数据包
byte[] buf = new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length)
4000
;
//接收数据,这里一执行数据包中就有数据了
ds.receive(dp);
//解剖该数据包,提取需要的数据
String id =dp.getAddress().getHostName();
System.out.println(new String(dp.getData(),0,dp.getLength()));
System.out.println(id);
//关闭资源
ds.close(); 
}

}

发送端用键盘录入的方式实现:

package udp;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import org.junit.Test;

public class UdpSend2 {
@Test
public void testSend() throws Exception {
// 键盘录入
BufferedReader bufr = new BufferedReader//
(new InputStreamReader//
 (System.in));
DatagramSocket ds = new DatagramSocket();
String line = null;

while((line=bufr.readLine())!=null){
//定义结束条件
if("886".equals(line)){
break;
}
//将读取到的键盘数据转化为字节
byte[] buf =line.getBytes();

//将数据包投递到指定地址端口
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("sun"),10008);
ds.send(dp);
}
ds.close();
}

}

用多线程实现的网络聊天:

package udp;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import org.junit.Test;

public class ChartDemo {
@Test
public void testChart() throws Exception{
new Thread(new UdpReceive(new DatagramSocket(20000))).start();
new Thread(new Udpsend(new DatagramSocket())).start();
}

}

//控制数据发送线程类

class Udpsend implements Runnable {
private DatagramSocket ds;
Udpsend(DatagramSocket ds ){
this.ds=ds;
}
@Override
public void run() {
try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("sun"), 20000);
ds.send(dp);
}
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
finally{
ds.close();
}
}

}

//控制数据接收线程类

class UdpReceive implements Runnable {

private DatagramSocket ds;
UdpReceive(DatagramSocket ds ){
this.ds=ds;
}
@Override
public void run() {
try {
while (true) {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());

}
} catch (Exception e) {
e.printStackTrace();
} finally {
ds.close();
}
}

}

------ android培训java培训,期待与您交流
------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息