不谈理论,先举简单例子。

发送端代码:

public class UDPDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
String str = "hello";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("127.0.0.1"),8888);
ds.send(dp);
ds.close();
}
}

接收端代码:

public class UDPDemo2 {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888);
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
ds.receive(dp);
int len = dp.getLength();
System.out.println(new String(dp.getData(),0,len));
}
}

运行结果:



UDP传输在笔者看来就是个”送快递”的过程,DatagramSocket看作一个快递站点,DatagramPacket看作是快递的货箱,需要传输的byte数组是我们要寄出的包裹。

这样设定好后我们来看发送端代码:

new DatagramSocket()就是随便找到一个快递站点,当然也可以指定站点(比如往里写端口号),str.getBytes()是我们要送的包裹,同时要知道包裹的体积或重量(str的长度)以及接收人和目的地(InetAddress与port),放入了快递货箱DatagramPacket里, send方法开始送货。

再看接收端代码:

同样是一个快递站点,但这个站点必须要指定了,也就是不可用new DatagramSocket()随便找站点,我们指定了8888端口号。DatagramPacket为一个给定容量的货箱(比如1024个字节),用receive方法开始接收。测试时先运行接收端,再运行发送端。这样就实现了UDP的简单传输。

(ps:需要注意的是像发送端代码写的str.length(),只适合发英文,改成str.getBytes().length最好)

基于以上代码,我们可以做个简单聊天界面:



代码如下:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.*;
import java.util.Calendar;
import javax.swing.*;
public class UDPDemo {
private static JTextArea view;
private static JTextArea sendTA;
private static JButton sendB;
private static Box northBox;
private static JFrame jf;
private Box southBox;
private JTextField jtf;
private DatagramSocket ds;
private DatagramSocket dsr;
public static void main(String[] args) throws Exception {
new UDPDemo();
}
UDPDemo() throws Exception{
initialJFrame();
initialNorthBox();
initialSouthBox();
ds = new DatagramSocket();
dsr = new DatagramSocket(8888);
receive();
jf.add(northBox);
jf.add(southBox,BorderLayout.SOUTH);
jf.setVisible(true);
}
private void initialSouthBox() {
southBox = Box.createHorizontalBox();
jtf = new JTextField("");
sendB = new JButton("发送");
sendB.addActionListener(new sendBActionListener());
southBox.add(jtf);
jtf.setPreferredSize(new Dimension(80,0));
southBox.add(sendB);
}
private void initialNorthBox() {
northBox = Box.createVerticalBox();
view = new JTextArea();
JScrollPane jsview = new JScrollPane(view);
jsview.setPreferredSize(new Dimension(0,180));
view.setEditable(false);
sendTA = new JTextArea();
JScrollPane jssendTA = new JScrollPane(sendTA);
northBox.add(jsview);
northBox.add(Box.createVerticalStrut(5));
northBox.add(jssendTA);
}
private void initialJFrame() {
jf = new JFrame();
jf.setBounds(250,100,500,500);
jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
private class sendBActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
try {
send();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
public void send() throws Exception {
if(sendTA.getText().length()==0) return ;
DatagramPacket dp = new DatagramPacket(sendTA.getText().getBytes(),
sendTA.getText().getBytes().length,
InetAddress.getByName(jtf.getText().trim()),
8888);
ds.send(dp);
view.append(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+"\n"+
sendTA.getText()+"\n");
sendTA.setText("");
}
public void receive() throws Exception {
new Thread() {
public void run() {
while(true) {
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
try {
dsr.receive(dp);
view.append(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+"\n"+
new String(dp.getData(),0,dp.getLength())+"\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
}

附(Java网络编程学习资料):http://t.cn/Ex4YBPX

Java 初学UDP传输的更多相关文章

  1. Java 使用UDP传输一个小文本文件

    工具1:Eclipse 工具2:IntelliJ IDEA Java工程的目录结构(基于IntelliJ IDEA) 例1.1:接收方,因为接收到的数据是字节流,为了方便,这里是基于Apache co ...

  2. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  3. java本地与树莓派中采用UDP传输文本、图片

    今天解决了一个困扰好几天的问题,由于比赛需要,需要用java语言,并采用UDP传输协议,让树莓派与服务器(就是本机)建立连接传输视频,图片. 由于UDP是建立在无连接的协议上,因此就碰到了一个很尴尬的 ...

  4. java UDP传输

    ①:只要是网络传输,必须有socket . ②:数据一定要封装到数据包中,数据包中包括目的地址.端口.数据等信息. 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对 ...

  5. 基于UDP传输协议局域网文件接收软件设计 Java版

    网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...

  6. java初学的分析

    java初学的分析第一阶段:入门阶段学习目标:简单项目开发学习内容:1.Java入门书籍,Java基础知识.关于Java入门级的书,给大家推荐过<Java编程思想>.<Java核心技 ...

  7. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  8. 在两个Android设备间通过UDP传输目录内文件

    这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步.有问题请指教. 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认. 程序跑起来后,看网络状况,有时候会一 ...

  9. Android如何实现TCP和UDP传输

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控 ...

随机推荐

  1. HU-1043

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 由于HDU这里的涉及多组数据,而每组数据按照一般的bfs()做法,即遍历每一种可行方案都保存一次路径,直到 ...

  2. SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)

    1.概念:SpringCloudConfig 高级配置 2.具体内容 在 SpringCloudConfig 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ...

  3. C# Excel导入数据

    表 表的创建脚本 CREATE TABLE [dbo].[TB_PROJECTS_New1]( , ) NOT NULL, ) NULL, ) NULL, , ) NULL, , ) NULL, , ...

  4. H5页面移动端IOS键盘收起焦点错位

    出现场景:IOS端,在弹出层点击input时调起键盘页面会被顶上去document.body.scrollOffset大于0,收起键盘时scrollOffset不变,造成焦点错位. 注:安卓手机点击时 ...

  5. winfrom中pictureBox控件的部分使用方法

    一.后台属性 1.pictureBox1.Image显示图片 2.pictureBox1.ImageLocation存储和提取图片路径 二.面板属性 1.Picturebox控件SizeMode属性 ...

  6. jq 获取下一个兄弟原素 下拉箭头旋转

    $('.weui-cells__title').on("click", function(e,rr){ isshow=$(this).attr('isshow') if(issho ...

  7. 简单搭建一个SpringBoot

    1.SpringBoot下载 https://start.spring.io/ 选择工程类型,编译语言,版本,工程名称,需要支持组件等:选择好了以后点击生成项目. 之后会下载一个压缩文件,解压之后导入 ...

  8. spring AOP capbilities and goal

    Spring AOP 是用纯JAVA 实现的. 不需借助JAVA代码在编译处理阶段来实现. Spring 是在运行期实现的.AOP的实现可以在编译,加载,运行三个阶段来实现:Spring AOP 也不 ...

  9. Rust2018

    Rust已经有2本中文书了 <<深入浅出Rust>> <<Rust编程之道>> 带着aync的rust 2019会更精彩 看async , 在这里htt ...

  10. Python设计模式 - UML - 交互概述图(Interaction Overview Diagram)

    简介 交互概述图是将不同交互图衔接在一起的图,属于UML2.0的新增图.交互概述图并没有引入新的建模元素,其主要元素来自于活动图和时序图.交互概述图侧重从整体上概览交互过程中的控制流,包括交互图之间的 ...