Java 初学UDP传输
不谈理论,先举简单例子。
发送端代码:
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传输的更多相关文章
- Java 使用UDP传输一个小文本文件
工具1:Eclipse 工具2:IntelliJ IDEA Java工程的目录结构(基于IntelliJ IDEA) 例1.1:接收方,因为接收到的数据是字节流,为了方便,这里是基于Apache co ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- java本地与树莓派中采用UDP传输文本、图片
今天解决了一个困扰好几天的问题,由于比赛需要,需要用java语言,并采用UDP传输协议,让树莓派与服务器(就是本机)建立连接传输视频,图片. 由于UDP是建立在无连接的协议上,因此就碰到了一个很尴尬的 ...
- java UDP传输
①:只要是网络传输,必须有socket . ②:数据一定要封装到数据包中,数据包中包括目的地址.端口.数据等信息. 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对 ...
- 基于UDP传输协议局域网文件接收软件设计 Java版
网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...
- java初学的分析
java初学的分析第一阶段:入门阶段学习目标:简单项目开发学习内容:1.Java入门书籍,Java基础知识.关于Java入门级的书,给大家推荐过<Java编程思想>.<Java核心技 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- 在两个Android设备间通过UDP传输目录内文件
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步.有问题请指教. 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认. 程序跑起来后,看网络状况,有时候会一 ...
- Android如何实现TCP和UDP传输
TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控 ...
随机推荐
- ServletContextListener中的方法contextInitialized执行了两次
有一个web06项目是直接拷贝web05的,复制过后web06项目默认的web配置中的Context Root还是web05,导致tomcat在启动时还是会创建两个web应用,修改成web06后,cl ...
- visual studio 2013 几个测试工具(Nunit 3、xUnit)
一.Nunit 3 1.在解决方案里添加一个类库——引用——右键(如下图)) 3.搜索nunit 并安装(如图) 3.注意引入命名空间并给测试类和测试方法添加特性(如图) 4.如果测试通过则为绿色(如 ...
- Ceph 集群整体迁移方案(转)
场景介绍:在我们的IDC中,存在着运行了3-6年的Ceph集群的服务器,这些服务器性能和容量等都已经无法满足当前业务的需求,在购入一批高性能机器后,希望将旧机器上的集群整体迁移到新机器上,当然,是保证 ...
- Linux 下配置 nginx + 两个 tomcat 的负载均衡
前提:已经安装了 nginx 和两个 tomcat 1.修改 nginx.conf 配置文件 1)在 http{} 节点之间添加 upstream 配置 2)修改 nginx 的监听端口,默认是 ...
- CPU二则
CPU二则 CPU二则 aligned load & unaligned load non-temporal store(streaming store) 参考文献 aligned load ...
- python入门(十一):异常
1.异常概念: >>> a Traceback (most recent call last): File "<stdin>", line 1, i ...
- IO分类
按流向分类: 输入流 读取数据 FileReader Reader 输出流 写入数据 FileWriter Writer 按数据类型分类: 字节流 字节输入流 读取数据 InputStream 字节输 ...
- 聚宽投资研究获取A股05年至今全部数据
#用中正全指'000985.XSHG'获取全部A股数据pool=get_index_stocks('000985.XSHG') #date存储05年开始全部交易时间 date=get_price('0 ...
- 关于web前端中遇到的html,css小知识点
容器溢出: 语法:overflow: visible | hidden | scroll | auto | inherit; visible:默认值,溢出内容不会被裁剪,正常显示 hidden: 溢出 ...
- Appium+python自动化获取toast消息的方法
转载地址:https://www.cnblogs.com/shangren/p/8191879.html 1. 首先执行这个命令:npm install -g cnpm --registry=http ...