- 浏览: 44014 次
- 性别:
java建立UDP连接和建立TCP/IP连接一样简单,只用到了SocketAddress(绑定主机的IP地址和应用程序端口,包括自己的和发送地)、DatagramSocket(数据套接字,接收和发送数据包都靠它,同时在new该对象时需要try…catch,而SocketAddress则无需)、DatagramPacket(数据包对象,UDP数据都是一个包一个包发送的)这三个类。然后实现起来是非常简单的。首先是发送方new两个SocketAddress对象,一个参数写自己的机子,另一个写要发送的目标主机。然后把自己的SocketAddress对象传入DatagramSocket创建其对象,假设对象名为ds。再将要发送的数据连同目标主机的SocketAddress对象一起传入DatagramPacket创建其对象,设为dp。最后调用方法ds.send(dp);就OK了。这是发送方的,接收方差不多,实现起来没多大难度。不过众所周知,UDP有一个特点却是比不上TCP/IP的,那就是建立的连接不一定非常可靠,经常会出现丢包的情况,所以需要在发送过程中添加检测机制,而这也就大大加大了实现的难度。基本检测机制是:
发送方发送一个数据包,接收方接收后,发回一个应答包告诉发送方已收到消息,此应答包包含发送的消息的唯一序列号。关于这个序列号的唯一性设置我还不是很明白,所以在测试中就把第n条消息的n作为序列号了。若发送方在一定时间内(时间长短可自行设置)未收到应答包则重发消息。重发消息有两个原因:①接收方未收到,此时重发是应该的。②接收方收到消息但是发回的应答包丢失了,此时重发消息则重复了,所以在接收方还得添加一个机制:若收到的消息与以前发过的消息重复,则再次发送应答包。在这些机制下,能够初步的保证UDP传输的完整性。以下是实现代码:
发送端:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.List; public class UDPServer { public UDPServer() { try { sa = new InetSocketAddress("127.0.0.1", 9999); ds = new DatagramSocket(sa); saa = new InetSocketAddress("127.0.0.1", 1234); String msg = ""; startThread(); new Thread() { public void run() { while (true) { recMsg(); } } }.start(); for (int i = 1;; i++) { msg = "第" + i + "条消息"; Msg m = new Msg(msg, i); sendMsg(m); list.add(m); Thread.sleep(1000); } } catch (Exception e) { } } public void sendMsg(Msg m) { DatagramPacket dp; try { dp = new DatagramPacket(m.getmsg().getBytes(), m.getmsg() .getBytes().length, saa); ds.send(dp); m.setsendtime(System.currentTimeMillis()); } catch (IOException e) { e.printStackTrace(); } } public void recMsg() { byte[] buffer = new byte[20]; DatagramPacket dpp = new DatagramPacket(buffer, buffer.length); try { ds.receive(dpp); } catch (IOException e) { e.printStackTrace(); } String rec = new String(dpp.getData()).trim(); int id = Integer.parseInt(rec.substring(4, rec.length() - 3)); for (int i = 0; i < list.size(); i++) { if (id == list.get(i).getid()) { System.out.println("确认对方已收到第" + list.get(i).getid() + "条消息,从队列中除去"); list.remove(i); } } } public void startThread() { new Thread() { public void run() { while (true) { // 如果list里面有元素 if (list.size() > 1) { for (int i = 0; i < list.size(); i++) { if (System.currentTimeMillis() - list.get(i).getsendtime() > 3000 && list.get(i).gettime() < 4) { sendMsg(list.get(i)); System.out.println("重发第" + list.get(i).getid() + "条消息第" + list.get(i).gettime() + "次"); if (list.get(i).gettime() == 3) { System.out.println("重发第" + list.get(i).getid() + "条消息已超过4次,丢弃包");// System.exit(0); list.remove(i); } else { list.get(i).settime( list.get(i).gettime() + 1); } } } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } public static void main(String[] args) { new UDPServer(); } class Msg { public Msg(String msg, int id) { this.msg = msg; this.id = id; } public void setid(int i) { id = i; } public int getid() { return id; } public void setmsg(String newmsg) { msg = newmsg; } public String getmsg() { return msg; } public void settime(int i) { time = i; } public int gettime() { return time; } public void setsendtime(long time) { lastsendtime = time; } public long getsendtime() { return lastsendtime; } private int id; private String msg; private int time; private long lastsendtime; } List<Msg> list = new ArrayList<Msg>(); SocketAddress sa; DatagramSocket ds; SocketAddress saa; }
接收端:
import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; public class UDPClient { JFrame f; JTextArea jta, jta2; SocketAddress sa; SocketAddress saa; DatagramSocket ds; List<Msg> list = new ArrayList<Msg>(); public UDPClient() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { } Font font = new Font("Dialog", Font.PLAIN, 12); f = new JFrame(); jta = new JTextArea(); jta.setFont(font); jta2 = new JTextArea(); jta2.setFont(font); JScrollPane jsp = new JScrollPane(jta); JScrollPane jsp2 = new JScrollPane(jta2); jsp.setPreferredSize(new Dimension(500, 400)); jsp2.setPreferredSize(new Dimension(300, 400)); f.setLayout(new FlowLayout()); f.add(jsp); f.add(jsp2); f.pack(); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(3); f.setVisible(true); sa = new InetSocketAddress("127.0.0.1", 1234); saa = new InetSocketAddress("127.0.0.1", 9999); new Thread() { public void run() { recMsg(); } }.start(); startThread(); } public void recMsg() { try { ds = new DatagramSocket(sa); while (true) { byte[] buffer = new byte[20]; DatagramPacket dpp = new DatagramPacket(buffer, buffer.length); jta.append("等待数据...\n"); ds.receive(dpp); String rec = new String(dpp.getData()).trim(); if (check(rec)) { jta.append(rec + "\n"); int id = Integer .parseInt(rec.substring(1, rec.length() - 3)); Msg m = new Msg(rec, id); list.add(m); send(m); } } } catch (IOException e) { e.printStackTrace(); } } public boolean check(String msg) { if (list.size() > 0) { for (int i = 0; i < list.size(); i++) { if (list.get(i).getmsg().equals("msg")) { send(list.get(i)); return false; } } } return true; } public void send(Msg m) { String msg = "已收到第" + m.getid() + "条消息"; try { DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length, saa); ds.send(dp); jta2.append(msg + "\n"); m.setrectime(System.currentTimeMillis()); } catch (IOException e) { e.printStackTrace(); } } public void startThread() { new Thread() { public void run() { while (true) { if (list.size() > 0) { for (int i = 0; i < list.size(); i++) { if (System.currentTimeMillis() - list.get(i).getrectime() > 5000) { list.remove(i); jta2.append("确认已收到第" + list.get(i).getid() + "条消息,从队列中除去\n"); } } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } public static void main(String[] args) { new UDPClient(); } class Msg { public Msg(String msg, int id) { this.msg = msg; this.id = id; } public void setid(int i) { id = i; } public int getid() { return id; } public void setmsg(String newmsg) { msg = newmsg; } public String getmsg() { return msg; } public void settime(int i) { time = i; } public int gettime() { return time; } public void setrectime(long time) { lastrectime = time; } public long getrectime() { return lastrectime; } private int id; private String msg; private int time; private long lastrectime; } }
运行结果如图所示:
发表评论
-
PlaySound和sndPlaySound的三种播放音乐方法
2012-11-16 21:18 8142首先要添加头文件 #include "mmsyst ... -
PlaySound和sndPlaySound的三种播放音乐方法
2012-11-16 21:16 1首先要添加头文件 #incl ... -
android中的Dialog
2012-06-28 20:20 1504android手机和PC机一样,也会根据各种不同程 ... -
关于网络通信中如何传输对象的问题
2012-03-14 17:09 1718我们不管在用TC ... -
设计模式所感
2012-03-10 22:03 1057刚接触高级语言编程的人是不会考虑怎么去设计类之间的 ... -
Hash表的建立及增删改查相关操作
2012-03-04 21:41 16411、什么是hash? Hash,一般翻译做“散列”,也 ... -
c语言实现简单链表建立及筛选
2012-02-23 01:05 1623最近在重新复习c,其实也可以算是学习吧。由于大一时上课没怎么听 ... -
小小的心得
2011-12-12 11:51 927关于jsp的,因为最近要做数据库,所以看了看,不过估计到最后数 ... -
javah的classpath路径设置
2011-11-20 22:01 4852貌似javah的classpath路径必须要设置~~ ... -
JTree实现windows文件打开
2011-11-16 19:46 1421package cn.zyf.java树1116; im ... -
文件搜索的简单实现
2011-10-24 00:46 1249快一个月没写总结了, ... -
java关键字总结
2011-09-25 17:09 808首先我们得明确,java中 ... -
关于事件源的应用
2011-09-21 00:52 787今天被画图板的一个鼠标右键单击处理事件的事情搞得晕头转 ...
相关推荐
摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输...
实现可靠的UDP传输。虽然名字叫UDT,但是和UDT有着本质区别(主要是不想费脑筋取名字),它可以像UDP一样实现多点自由传输,而无需像UDT那样必须建立服务器,然后等待连接然后在传输。 所用原理就是简单的 确认 + 超时...
以下是一种串行的带验证重发机制的UDP传输文件,源代码,client负责发文件,server负责接文件。希望对大家有帮助。程序中,发送的包是自己定义的,这样除了可以将需要发送的数据发送过去外,还可以将一些控制信息发...
qt实现udp传输文件(图片、文档之类)里面还包含tcp传输数据(不是文件)
用套接字实现了udp具体的传输,在c++环境下验证通过
UDP源码 UDP UDP传输 UDP发送文件 UDP发送
基于socket UDP协议实现文件传输(windows vc++源代码) UDP传1GB的文件仅需15秒 该代码包含 根据文件内容长度生成MD5码,以供校验文件完整性 本代码包含windows vc++编写dll的代码
基于c++的udp传输,传送超过10M的文件。完成服务端和客户端之间的传输
用c++ 的基础udp API实现了停等协议,在应用层实现了可靠udp传输,用MFC编写界面,带文档,可用于计算机网络课程设计
c语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP传输系统源码.rarc语言UDP...
c语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP传输系统源码.zipc语言UDP...
本资源是基于 UDP 协议与 OpenCV 库实现网络视频传输的实现代码,使用 Python 语言实现,分为服务器端和客户端两个文件,启动前需要修改 host IP 地址为实际的 IP 地址,同时需注意先运行服务器端代码,再运行客户端...
udp传输udp传输的mvc实验 udp传输udp传输的mvc实验
实现了android 在udp的应用,比较好的资料
UDP实现可靠文件传输.doc UDP实现可靠文件传输.doc
用UDP实现的可靠传输源码。用UDP实现的可靠传输源码用UDP实现的可靠传输源码
用UDP实现可靠文件传输 用UDP实现可靠文件传输 用UDP实现可靠文件传输
本项目是创新实验课最后的大实验,开发了一个可靠的UDP传输系统,采用了应答响应的思路,也就是TFTP的基本原理。整个开发过程全部使用的最简单易懂的代码,本人学习java网络编程也就用了一两周吧,但有一些c语言套接...
本资源是使用 java,分别用 TCP 和 UDP 传输文件的源代码。读者朋友可以下载下来,参考着满足自己的需求。 另有博客《Java 使用 TCP 和 UDP 传输文件》可以参考,地址是:...
1、可以让pc通过udp与FPGA之间双向传输视频/图片。 2、udp传图的数据不经过压缩按:R(8bit)、G(8bit)、B(8bit)一个像素点一个像素点传输。 小白边学边写的,可能有很多问题,仅供参考!