请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

houcx

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2257|回复: 0

java网络编程基础:UDP

[复制链接]

235

主题

237

帖子

1189

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1189
发表于 2015-8-3 15:33:19 | 显示全部楼层 |阅读模式
目录1、网络知识基础2、UDP传输3、利用UDP模仿聊天室
1、网络知识基础
1.1网络通讯要素
IP地址标识设备,本地默认IP:127.0.0.1,主机名:localhost
端口号标识进程,有效端口号:0-65535,其中0-1024系统保留
传输协议通讯规则,TCP,UDP等
1.2InetAddress类
  表示互联网协议 (IP) 地址,常用方法:
getLocalHost()返回本地主机
getByName(String str)根据给定主机名(IP地址字符串)获得IP地址
getHostName() 返回此IP地址的主机名
getHostAddress()返回IP地址字符串
1.3域名解析
  DNS,DomainNameSystem域名系统,将我们访问网站时输入的域名(例如www.oracle.com)解析为ip.电脑里本地的DNS解析文件位于C:\Windows\System32\drivers\etc目录下的HOSTS文件,可以对其修改,添加自定义域名解析表,实现屏蔽广告页面等功能(将广告页面的网址对应127.0.0.1)
1.4URL类
URL是统一资源定位符,示例代码
Java代码  [url=][/url]

  • public class URLDemo {  
  •   
  •     public static void main(String[] args) throws IOException {  
  •   
  •         URL url = new URL("http://192.168.1.100:8080/myweb/index.html?name=zhangsan");  
  •   
  •         System.out.println(url.getProtocol());  
  •         System.out.println(url.getHost());  
  •         System.out.println(url.getPort());  
  •         System.out.println(url.getFile());  
  •         System.out.println(url.getPath());  
  •         System.out.println(url.getQuery());  
  •   
  •     }  
  • }   

1.5Socket简介
  网络通信的端点,通信的两端都有Socket,网络通信其实就是Socket之间的通信,数据在两个Socket间通过IO传输

2、UDP传输
2.1UDP特点
    User Datagram Protocol 用户数据报协议
    无连接,不可靠的协议
    将数据封装成数据包,每个大小限制在64K内,速度快
2.2相关类
    DatagramSocket
      Socket服务类,主要方法:send(),receive()等,receive方法为阻塞方法
    DatagramPacket
      数据报包类,用于封装和解析数据
  注意
    发送端和接收端是两个独立运行的程序,接收端必须明确端口号
2.3例代码
Java代码  [url=][/url]

  • // 发送端  
  • public class Sender {  
  •   
  •     public static void main(String[] args) throws IOException {  
  •   
  •         // 1:使用DatagramSocket对象,简历UDP的Socket服务  
  •         DatagramSocket socket = new DatagramSocket();  
  •   
  •         // 2:使用DatagramPacket对象,将要发送的数据封装在数据报包中  
  •         String str = "Hello World";  
  •         byte[] buf = str.getBytes();  
  •         DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 10000);  
  •   
  •         // 3:通过Socket服务,调用send()方法将数据报包发送出去  
  •         socket.send(packet);  
  •   
  •         // 4:关闭Socket服务  
  •         socket.close();  
  •     }  
  • }                 
  •   
  • // 接收端  
  • public class Receiver {  
  •   
  •     public static void main(String[] args) throws IOException {  
  •   
  •         // 1:使用DatagramSocket对象,简历UDP的Socket服务  
  •         DatagramSocket socket = new DatagramSocket(10000);  
  •   
  •         // 2:使用DatagramPacket对象,用于接收数据报包数据  
  •         byte[] buf = new byte[1024];  
  •         DatagramPacket packet = new DatagramPacket(buf, buf.length);  
  •   
  •         // 3:通过Socket的receive()方法将接受的数据存储在数据报包中  
  •         socket.receive(packet);  
  •   
  •         // 4:通过数据报包对象的方法解析数据包中的数据(地址,端口,数据内容等)  
  •         String ip = packet.getAddress().getHostAddress();  
  •         int port = packet.getPort();  
  •         String str = new String(packet.getData(), 0, packet.getLength());  
  •         System.out.println(ip + ":" + port + ":" + str);  
  •   
  •         // 5:关闭Socket服务  
  •         socket.close();  
  •     }  
  • }  


3、利用UDP模仿聊天室
  将上述代码进行改进,增加多线程和发广播的功能,可以实现简易的聊天室:
  1.     //发送端任务类
  2.                                 public class Send implements Runnable {

  3.                                         private DatagramSocket socket;

  4.                                         public Send(DatagramSocket socket) {
  5.                                                 this.socket = socket;
  6.                                         }

  7.                                         @Override
  8.                                         public void run() {
  9.                                                 BufferedReader reader = new BufferedReader(new InputStreamReader(
  10.                                                                 System.in));
  11.                                                 String words = null;
  12.                                                 try {
  13.                                                         while ((words = reader.readLine()) != null) {
  14.                                                                 byte[] buf = words.getBytes();
  15.                                                                 // 255表示发广播
  16.                                                                 DatagramPacket packet = new DatagramPacket(buf, buf.length,
  17.                                                                                 InetAddress.getByName("192.168.1.255"), 10000);
  18.                                                                 socket.send(packet);
  19.                                                                 // 模拟结束
  20.                                                                 if ("886".equals(words)) {
  21.                                                                         break;
  22.                                                                 }
  23.                                                         }
  24.                                                         socket.close();
  25.                                                 } catch (IOException e) {
  26.                                                         e.printStackTrace();
  27.                                                 }

  28.                                         }

  29.                                 }

  30.                                 //接收端任务类
  31.                                 public class Receive implements Runnable {

  32.                                         private DatagramSocket socket;

  33.                                         public Receive(DatagramSocket socket) {
  34.                                                 this.socket = socket;
  35.                                         }

  36.                                         @Override
  37.                                         public void run() {
  38.                                                 try {
  39.                                                         while (true) {
  40.                                                                 byte[] buf = new byte[1024];
  41.                                                                 DatagramPacket packet = new DatagramPacket(buf, buf.length);
  42.                                                                 socket.receive(packet);

  43.                                                                 String ip = packet.getAddress().getHostAddress();
  44.                                                                 String message = new String(packet.getData(), 0,
  45.                                                                                 packet.getLength());
  46.                                                                 System.out.println(ip + ":" + message);

  47.                                                         }
  48.                                                 } catch (IOException e) {
  49.                                                         e.printStackTrace();
  50.                                                 }
  51.                                         }

  52.                                 }

  53.                                 //开启聊天
  54.                                 public class Chart {

  55.                                         public static void main(String[] args) throws SocketException {
  56.                                                 DatagramSocket send = new DatagramSocket();
  57.                                                 DatagramSocket receive = new DatagramSocket(10000);
  58.                                                 new Thread(new Send(send)).start();
  59.                                                 new Thread(new Receive(receive)).start();
  60.                                         }

  61.                                 }
复制代码

来自:http://xiao1zhao2.iteye.com/blog/2232181
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|houcx ( 京ICP备15004793号  

GMT+8, 2019-9-20 19:55 , Processed in 0.058850 second(s), 24 queries .

Powered by houcx! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表