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 ...
随机推荐
- XSS学习小结
一.什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了. 这里我们主要注 ...
- 视频采集,存成avi
视频采集,存成aviunit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Form ...
- Concurrency and Race Conditions
1.当多个线程访问共享硬件或软件资源的任何时候,由于线程之间可能产生对资源的不一致观察,所以必须显式管理对资源的访问. 2.内核中的并发管理设施: (1). 信号量: P操作将信号量的值减 1 ,判断 ...
- mysql数据类型长度
1个字节= 8位 tinyint 为一个字节 2的8次方= 256 所以最多存储到256 日期和时间数据类型 MySQL数据类型 含义 date 3字节,日期,格式:2014-09-18 time ...
- SpringMVC上传文件的MultipartFile源码
零.MultipartFile上传文件的具体实例如下: http://blog.csdn.net/swingpyzf/article/details/20230865 一.具体类和方法 上传文件主要方 ...
- poj1088(记忆化搜索入门题)
题目链接:http://poj.org/problem?id=1088 思路: 明显的记忆化搜索题,用dp[i][j]表示从(i,j)出发能滑的最远距离,用dfs搜索,若dp[x][y]>0即已 ...
- LibreOJ 6282 数列分块入门 6(在线插入在线查询)
题解:还是分块,将每个块存入vector,然后在插入的时候就是sqrt(n)级的重构,如果块太大了,暴力将这个块拆开. 代码如下: #include<cmath> #include< ...
- java程序员从ThinkPad到Mac的使用习惯改变
https://blog.csdn.net/yczz/article/details/49993417
- N皇后问题12 · N-Queens
[抄题]: n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击. 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分 ...
- 带最小值操作的栈 · Min Stack
[抄题]: 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. [思维问题]: [一句话思 ...