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 传输控 ...
随机推荐
- HTTP发送RAW请求注意的问题
1.使用jar httpcomponents-client-4.5.6-bin.tar.gz 解压后倒入lib中的所有包 2.参考代码如下 import org.apache.http.HttpRes ...
- java面试总结(资料来源网络)
core java: 一.集合 1.hashMap 结构如图: HashMap在Map.Entry静态内部类实现中存储key-value对. HashMap使用哈希算法.在put和get方法中.它使用 ...
- 8Linux磁盘划分、RAID
磁盘划分fdisk 1.磁盘分区 fdisk 2.格式化 mkfs.ext4 mkfs.xfs 3.挂载 mount 路径 挂载路径 fdisk命令中的参数以及作用 参数 作用m 查看全部可用的参数n ...
- P1461 海明码 Hamming Codes
题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...
- Linux安装OPENJDK配置环境变量
# yum search openjdk 回车 找到open开发者环境jdk版本复制它的名字 安装java-1.8.0-openjdk-headless.x86_64 yum install j ...
- jQuery 效果 - 动画 animate() 方法
我们先看一个demo <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11. ...
- logback kafkaAppender输出日志到kafka
官网地址https://github.com/danielwegener/logback-kafka-appender 本文以spring boot项目为基础,更多的信息,请参考官网 https:// ...
- 在Maven中新增自定的jar包
引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介 ...
- vue+el-menu设置了router之后如何跳转到外部链接
<el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="c ...
- std::remove_reference
[std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #inc ...