以课程中feiQ为例,feiQ作为一个典型的网络编程应用,用一段代码尝试给自己的发送消息

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Demo1 { public static void main(String[] args) throws IOException {
// 建立udp的服务
DatagramSocket socket = new DatagramSocket();
// 准备数据,把数据封装到数据包中
String data = "feiQ你好!";
DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("192.168.1.101"), 2425);
// 发送数据
socket.send(packet);
// 关闭资源
socket.close();
}
}

此代码在执行的时候是是失败的,在网络编程(1)中,运行的接收和发送方是成功的,为什么这里就不可以了呢?

原因: 每个网络程序都有自己所处理的特定格式数据,如果接收到的数据不符合指定的格式,那么就会被当成垃圾数据丢弃。(加密)

feiQ是局域网程序,所以可以随便尝试,QQ作为面向大众,尝试的话就会犯罪~hiahiahia~~不要玩火哟!

解决方法:

  飞Q接收的数据格式:
   version:time :sender : ip: flag:content ;
   版本号:时间:发送人 :IP:发送的标识符(32): 真正的内容;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Demo1 { public static void main(String[] args) throws IOException {
// 建立udp的服务
DatagramSocket socket = new DatagramSocket();
// 准备数据,把数据封装到数据包中
String data = getData("feiQ你好!");
DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("192.168.15.255"), 2425);
// 发送数据
socket.send(packet);
// 关闭资源
socket.close();
}
// 把数据拼接成指定格式的数据
public static String getData(String content) {
StringBuilder sb = new StringBuilder();
sb.append("1.0:");
sb.append(System.currentTimeMillis() + ":");
sb.append("小号:");
sb.append("192.168.10.1:");
sb.append("32:");
sb.append(content);
return sb.toString();
}
}

解决群发(一对多)问题只需修改为广播地址

在udp协议中,有一个IP地址称作为广播地址,广播地址就是主机号为255地址。给广播IP地址发送消息的时候,在同一个网络段的机器都可以接收 到信息。(192.168.15.255)

给send方法加一个死循环会特别嗨哟

群聊(多对多):同时要发送和接收(多线程)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; //发送
public class Demo3 extends Thread {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet = null;
while((line = reader.readLine())!=null) {
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.15.255"), 9090);
socket.send(packet);
socket.close();
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
//接收
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; public class Demo2 extends Thread {
@Override
public void run() { try {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag) {
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf,0,packet.getLength()));
}
socket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//启动多线程
public class Demo4 {
public static void main(String[] args) {
Demo3 receive = new Demo3();
receive.start(); Demo2 send = new Demo2();
send.start();
}
}
udp是一个不可靠(数据包可能会丢失的协议,什么情况下数据包会出现丢失呢?,并测试
1.带宽不足 。
2.cpu的处理能力不足。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Demo5 { public static void main(String[] args) throws Exception {
//建立udp的服务
DatagramSocket socket = new DatagramSocket();
//准备数据,数据封装到数据中发送
DatagramPacket packet = null;
for(int i = 0 ; i< 10; i++){ //连续发送10个数据包,如果你家机子好网速好就加大数据量
String data =i +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
//发送数据包
socket.send(packet);
}
//关闭资源
socket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class Demo6 { public static void main(String[] args) throws IOException, Exception {
//建立udp的服务
DatagramSocket socket = new DatagramSocket(9090); //建立空的数据包存储数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length); //不断接收数据包
while(true){
socket.receive(packet);
System.out.println(new String(buf,0,packet.getLength()));
Thread.sleep(10);
}
}
}

之所以上一段代码不关闭接收端socket是为了无限接收数据。

最新文章

  1. 数据可视化 echarts3
  2. 【干货分享】Node.js 中文学习资料和教程导航
  3. windows64系统中mysql64位绿色安装
  4. 【BZOJ 1031】[JSOI2007]字符加密Cipher
  5. 隐藏NavigationBar 带来的坑
  6. c#将Excel数据导入到数据库的实现代码(OleDb)
  7. Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别
  8. C++学习笔记9-运算符重载
  9. iOS开发 调用系统相机和相册 分类: ios技术 2015-03-30 15:52 65人阅读 评论(0) 收藏
  10. 第二次项目冲刺(Beta阶段)5.20
  11. jQuery图片延迟加载插件jquery.lazyload.js
  12. 分享超好用的截动图工具ScreenToGif
  13. JavaScript函数表达式与函数声明
  14. [精华][推荐]CAS SSO 单点登录框架学习 环境搭建
  15. 各种反演细节梳理&amp;模板
  16. (贪心 map) Flying to the Mars hdu1800
  17. mongodb管理与安全认证
  18. 【CF480D】Parcels DP
  19. RabbitMQ的几个概念
  20. 挂载本地iso镜像

热门文章

  1. linux上实现jmeter分布式压力测试(转)
  2. 初识PromQL
  3. Intel推出两款新处理器路线图公布
  4. easyui 加载本地json 文件的方法
  5. bootloader 详细介绍
  6. boost::program_options 解析命令行参数
  7. 嵊州普及Day4T1
  8. Spring任务调度实战之Quartz Cron Trigger
  9. js学习(三)对象与事件
  10. 【C】揭秘rand()函数;