java socket 之UDP编程
一、概念
在TCP的所有操作中都必须建立可靠的连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外的一种传输协议——UDP,不可靠的连接(这种协议在各种聊天工具中被广泛使用)。
在UDP程序的开发中使用DatagramPacket包装一条要发送的信息,之后使用DatagramSocket用于完成信息的发送操作。
例如:现在使用聊天工具进行聊天,那么A发送的信息B不一定能够接收的到,因为使用的就是UDP协议。
基于UDP通信的基本模式:
(1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。
(2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。
以下用一个聊天程序来说明,功能效果如下图所示:

二、工程目录

三、服务端
1)UDPServer类,服务端主类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class UDPServer extends JFrame implements ActionListener{ JTextArea jta;
JTextField jtf;
JButton jb;
JPanel jp;
ServerToClientThread stcT; public static void main(String[] args) {
// TODO Auto-generated method stub
new UDPServer();
} public UDPServer()
{
setTitle("UDP服务端");
jta=new JTextArea();
jtf=new JTextField(15);
jb=new JButton("发送");
jb.addActionListener(this); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jta,"Center");
this.add(jp,"South");
this.setBounds(300, 200, 300, 200);
this.setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
stcT = new ServerToClientThread(jta);
stcT.start(); /**窗体关闭按钮事件*/
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(JOptionPane.showConfirmDialog(null, "<html>确定退出吗?","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0)
{
System.exit(0);
stcT.closeSocket();
}
else
{
return;
}
}
});
} @Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//假如点击了按钮jb
if(arg0.getSource()==jb)
{
byte buffer[] = jtf.getText().trim().getBytes();
stcT.sendData(buffer);
} } }
2)ServerToClientThread类,服务端处理线程
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; import javax.swing.JTextArea; /**
* @author lenovo
*
*/
public class ServerToClientThread extends Thread{ private String sendIP = "127.0.0.1";
private int sendPORT = 6666;
private int receivePORT = 8888;
//声明发送信息的数据报套结字
private DatagramSocket sendSocket = null;
//声明发送信息的数据包
private DatagramPacket sendPacket = null;
//声明接受信息的数据报套结字
private DatagramSocket receiveSocket = null;
//声明接受信息的数据报
private DatagramPacket receivePacket = null; //缓冲数组的大小
public static final int BUFFER_SIZE = 5120;
private byte inBuf[] = null; //接收数据的缓冲数组 JTextArea jta; // 构造函数
public ServerToClientThread(JTextArea jta) {
this.jta = jta;
} public void run() {
try{
inBuf = new byte[BUFFER_SIZE];
receivePacket = new DatagramPacket(inBuf,inBuf.length);
receiveSocket = new DatagramSocket(receivePORT);
}catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
} while (true) {
if(receiveSocket == null){
break;
} else {
try {
receiveSocket.receive(receivePacket);
String message = new String(receivePacket.getData(),0,receivePacket.getLength());
jta.append("收到数据"+message+"\n");
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
}
} public void sendData(byte buffer[]){
try{
InetAddress address = InetAddress.getByName(sendIP);
// outBuf = new byte[BUFFER_SIZE];
sendPacket = new DatagramPacket(buffer,buffer.length,address,sendPORT);
sendSocket = new DatagramSocket();
sendSocket.send(sendPacket);
}catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
public void closeSocket(){
receiveSocket.close();
}
}
三、客户端
1)UDPClient类,客户端主类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class UDPClient extends JFrame implements ActionListener{ JTextArea jta;
JTextField jtf;
JButton jb;
JPanel jp;
ClientToServerThread ctsT; public static void main(String[] args) {
// TODO Auto-generated method stub
new UDPClient();
} public UDPClient()
{
setTitle("UDP客户端");
jta=new JTextArea();
jtf=new JTextField(15);
jb=new JButton("发送");
jb.addActionListener(this); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jta,"Center");
this.add(jp,"South");
this.setBounds(300, 200, 300, 200);
this.setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ctsT = new ClientToServerThread(jta);
ctsT.start(); /**窗体关闭按钮事件*/
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(JOptionPane.showConfirmDialog(null, "<html>确定退出吗?","系统提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)==0)
{
System.exit(0);
ctsT.closeSocket();
}
else
{
return;
}
}
});
} @Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//假如点击了按钮jb
if(arg0.getSource()==jb)
{
byte buffer[] = jtf.getText().trim().getBytes();
ctsT.sendData(buffer);
} } }
2)ClientToServerThread类,客户端线程处理类
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; import javax.swing.JTextArea; /**
* @author lenovo
*
*/
public class ClientToServerThread extends Thread{ private String sendIP = "127.0.0.1";
private int sendPORT = 8888;
private int receivePORT = 6666;
//声明发送信息的数据报套结字
private DatagramSocket sendSocket = null;
//声明发送信息的数据包
private DatagramPacket sendPacket = null;
//声明接受信息的数据报套结字
private DatagramSocket receiveSocket = null;
//声明接受信息的数据报
private DatagramPacket receivePacket = null; //缓冲数组的大小
public static final int BUFFER_SIZE = 5120; private byte inBuf[] = null; //接收数据的缓冲数组 JTextArea jta; // 构造函数
public ClientToServerThread(JTextArea jta) {
this.jta = jta;
} public void run() {
try{
inBuf = new byte[BUFFER_SIZE];
receivePacket = new DatagramPacket(inBuf,inBuf.length);
receiveSocket = new DatagramSocket(receivePORT);
}catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
} while (true) {
if(receiveSocket == null){
break;
} else {
try {
receiveSocket.receive(receivePacket);
String message = new String(receivePacket.getData(),0,receivePacket.getLength());
jta.append("收到数据"+message+"\n");
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
}
} public void sendData(byte buffer[]){
try{
InetAddress address = InetAddress.getByName(sendIP);
sendPacket = new DatagramPacket(buffer,buffer.length,address,sendPORT);
//注意发送的时候,socket不需要绑定地址
sendSocket = new DatagramSocket();
sendSocket.send(sendPacket);
}catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
public void closeSocket(){
receiveSocket.close();
}
}
java socket 之UDP编程的更多相关文章
- 【Socket编程】通过Socket实现UDP编程
通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...
- Java Socket聊天室编程(二)之利用socket实现单聊聊天室
这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...
- Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
- python网络-Socket之udp编程(24)
一.udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地. udp在 ...
- 十、Socket之UDP编程
UDP基础知识 UDP(User Datagram Protocol,用户数据报协议)是一个简单的.面向数据报的无连接协议,提供了快速但不一定可靠的传输服务. UDP与TCP相比主要有以下区别. 1. ...
- Java基础教程——UDP编程
UDP:User Datagram Protocol,用户数据报协议 服务端: import java.net.*; import java.io.*; public class UdpServer ...
- 【LINUX/UNIX网络编程】之使用SOCKET进行UDP编程
先看任务需求: 实验二 UDP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本UDP通讯,实现服务器与客户端的文件传送 [实验学时] 4学时 [实验内容] ...
- Java Socket实现基于TCP和UDP多线程通信
一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...
- Java Socket应用---通信是这样练成的
网络基础简介 Java 中网络相关 API 的应用 Java 中的 InetAddress 的应用 Test01.java package com.imooc; import java.n ...
随机推荐
- css兼容性记录
* , ie6,ie7可以识别: _和- , ie6可以识别: !important ,表示高优先级,ie7及以上,firefox都支持,ie6认识带!important的样式属性, ...
- SQL2008R2 express版本不支持维护计划
SQL2008R2 express版本不支持维护计划
- Haskell语言学习笔记(25)MonadState, State, StateT
MonadState 类型类 class Monad m => MonadState s m | m -> s where get :: m s get = state (\s -> ...
- Mysql 5.8安装报错
1 mysql安装过程中报下面这个错 解决方法:只要将目录改成反斜杠即可. 2 修改密码错误:ERROR 1064 (42000): You have an error in your SQL syn ...
- 面向对象三大特性一一封装(encapsulation)
为什么要封装? 我们看电视,只要按一下开关和换台就行了.有必要了解电视的内部结构吗?有必要了解显像管吗? 封装是为了隐藏对象内部的复杂性,只对外公开简单的接口.便于外界调用,从而提高系统的可扩展性,可 ...
- 兼容当前五大浏览器的渐变颜色背景gradient的写法
<style type="text/css" media="screen"> #gradient { width: 200px; height: 2 ...
- Anaconda中python加入环境变量
1.我的电脑---高级系统设置 2.选中环境变量,保存. 3.在系统环境变量PATH中,加入Anaconda3及Script路径加入其中 4.测试python
- Java.sql.SQLException: 无效的列类型: 1111
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: ...
- The value for the useBean class attribute is invalid.
报错如下: The value for the useBean class attribute com.JavaBeanTest is invalid. 解决方法: 在JavaBean代码中加入无参数 ...
- racktables 的介绍及搭建指南
Racktables RackTables称自己为一个“机架空间.IP地址.服务器.交换机.路由器等 的管理框架”.它拥有一个web界面,执行报告和配置,并管理名字服务.RackTables以PHP5 ...