网络编程-UDP
代码部分--UDP传输
* 1.发送Send
* 创建DatagramSocket, 随机端口号
* 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket
* 关闭DatagramSocket
package demo1; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class Test_send {
/** 1.发送Send
* 创建DatagramSocket, 随机端口号
* 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket
* 关闭DatagramSocket
* @throws SocketException */
public static void main(String[] args) throws Exception {
//定义要传输的字符串
String str="hahhah";
//创建socket
DatagramSocket socket=new DatagramSocket();
//创建packet()
DatagramPacket packet =new DatagramPacket(str.getBytes(),
str.getBytes().length,InetAddress.getByName("127.0.0.1"),6666);
//发送数据
socket.send(packet);
//关闭socket
socket.close(); }
}
* 2.接收Receive
* 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
package demo1; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; public class Test_receiver {
/** 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
* @throws Exception */ public static void main(String[] args) throws Exception {
//创建socket相当有码头
DatagramSocket socket=new DatagramSocket(6666);
//创建packet相当于集装箱
DatagramPacket packet=new DatagramPacket(new byte[1024],1024);
//获取数据
socket.receive(packet);
//关闭socket
socket.close();
//从packet中取出数据
byte[] data=packet.getData();
System.out.println(new String(data,0,packet.getLength())); }
}


UDP传输优化(不断的发送,接收)
package demo1; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner; public class Test_send {
/**
* 1.发送Send 创建DatagramSocket, 随机端口号 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket 关闭DatagramSocket
*
* @throws SocketException
*/
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
// 创建socket
DatagramSocket socket = new DatagramSocket();
while (true) {
String line = in.nextLine();
if ("quit".equals(line)) {
break;
} else {
// 创建packet()
DatagramPacket packet = new DatagramPacket(line.getBytes(),
line.getBytes().length,
InetAddress.getByName("127.0.0.1"), 6666);
// 发送数据
socket.send(packet);
}
}
// 关闭socket
socket.close(); }
}
package demo1; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; public class Test_receiver {
/** 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
* @throws Exception */ public static void main(String[] args) throws Exception {
//创建socket相当有码头
DatagramSocket socket=new DatagramSocket(6666);
//创建packet相当于集装箱
DatagramPacket packet=new DatagramPacket(new byte[1024],1024);
while(true)
{
//获取数据
socket.receive(packet);
//从packet中取出数据
byte[] data=packet.getData();
//获取ip
String ip=packet.getAddress().getHostAddress();
System.out.println("ip:"+ip+" :"+new String(data,0,packet.getLength()));
} }
}

* 3.接收方获取ip和端口号
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();
UDP传输优化(多线程)
package demo1; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner; public class Test_send {
/**
* 1.发送Send 创建DatagramSocket, 随机端口号 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket 关闭DatagramSocket
*
* @throws SocketException
*/
public static void main(String[] args) throws Exception {
new Receive().start();
new Send().start();
}
} class Send extends Thread
{
public void run()
{
try {
Scanner in = new Scanner(System.in);
// 创建socket
DatagramSocket socket; socket = new DatagramSocket(); while (true) {
String line = in.nextLine();
if ("quit".equals(line)) {
break;
} else {
// 创建packet()
DatagramPacket packet = new DatagramPacket(line.getBytes(),
line.getBytes().length,
InetAddress.getByName("127.0.0.1"), 9999);
// 发送数据
socket.send(packet);
}
}
// 关闭socket
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} class Receive extends Thread
{
public void run()
{ try {
//创建socket相当有码头
DatagramSocket socket=new DatagramSocket(9999);
//创建packet相当于集装箱
DatagramPacket packet=new DatagramPacket(new byte[1024],1024);
while(true)
{
//获取数据
socket.receive(packet);
//从packet中取出数据
byte[] data=packet.getData();
//获取ip
String ip=packet.getAddress().getHostAddress();
System.out.println("ip:"+ip+" :"+new String(data,0,packet.getLength()));
}
}catch (IOException e) {
e.printStackTrace();
}
}
}

UDP优化-GUI界面聊天(显示+关闭+发送)
界面


代码实现
package demo2; import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
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.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date; public class GUIDemo extends Frame {
TextField ip;
Button send;
Button log;
Button clear;
Button shake;
TextArea show;
TextArea edit;
DatagramSocket socket; /**
* 窗体的初始化
*/
public GUIDemo() {
// 基本控件的初始化
init();
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
// 南边panel的初始化
sourceMade();
// 中间panel的初始化
centerMade();
// 事件添加
event();
} /**
* 中间panel构建
*/
public void centerMade() {
Panel center = new Panel();
center.setLayout(new BorderLayout());
show = new TextArea();
show.setEditable(false);
show.setFont(new Font("xxx", Font.PLAIN, 15));
edit = new TextArea();
edit.setFont(new Font("xxx", Font.PLAIN, 15));
center.add(show, BorderLayout.CENTER);
center.add(edit, BorderLayout.SOUTH);
this.add(center, BorderLayout.CENTER); } /**
* 南边窗体初始化
*/
public void sourceMade() {
Panel source = new Panel();
ip = new TextField(15);
ip.setText("127.0.0.1");
send = new Button("发送");
log = new Button("记录");
clear = new Button("清屏");
shake = new Button("震动");
source.add(ip);
source.add(send);
source.add(log);
source.add(clear);
source.add(shake);
this.add(source, BorderLayout.SOUTH);
} public void init() {
this.setLocation(500, 500);
this.setSize(400, 600);
new Receive().start();
this.setVisible(true);
} public void event() {
// 关闭窗体事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
socket.close();
System.exit(0);
}
}); // 发送事件
send.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
send();
} catch (IOException e1) {
e1.printStackTrace();
}
} }); // 记录事件 // 清屏事件 // 震动事件 } public void send() throws IOException { String message = edit.getText();
String host = ip.getText();
DatagramPacket packet = new DatagramPacket(message.getBytes(),
message.getBytes().length, InetAddress.getByName(host), 9999);
socket.send(packet); String time = getCurrentTime();
show.append(time + "我对" + host + "说:\r\n" + message + "\r\n\r\n");
edit.setText("");
} private String getCurrentTime() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
return sdf.format(date);
} public static void main(String[] args) {
GUIDemo demo = new GUIDemo();
} private class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(9999);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true) {
socket.receive(packet);
String message = new String(packet.getData(), 0,
packet.getLength());
String time = getCurrentTime();
String ipstr = packet.getAddress().getHostAddress();
show.append(time + " " + ipstr + " 对我说:\r\n" + message
+ "\r\n\r\n");
}
} catch (Exception e) {
e.printStackTrace();
} }
} }
UDP优化-GUI界面聊天(记录+清屏+震动)
清屏
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                show.setText("");
            }
        });
记录
// 记录事件
log.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
logFile();
} catch (Exception e1) {
e1.printStackTrace();
}
} });
public void logFile() throws Exception {
        bw.flush();
        //获取输入流
        FileInputStream fis=new FileInputStream("src/log.txt");
        //创建缓冲区
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        int len;
        byte arr[]=new byte[8192];
        while((len=fis.read(arr))!=-1)
        {
            baos.write(arr,0,len);
        }
        String str=baos.toString();
        show.setText(str);
    }
震动
// 震动事件
shake.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
send(new byte[]{-1},ip.getText());
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
    public void shake() {
        int x=getLocation().x;
        int y=getLocation().y;
        for(int i=0;i<3;i++)
        {
            try {
                this.setLocation(x+10,y+10);
                Thread.sleep(20);
                this.setLocation(x+10,y-10);
                Thread.sleep(20);
                this.setLocation(x-10,y+10);
                Thread.sleep(20);
                this.setLocation(x-10,y-10);
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setLocation(x,y);
    }
UDP优化-GUI界面聊天(快捷键)
//快捷键发送
edit.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
//CTRL+回车====》发送信息
if(e.getKeyChar()==KeyEvent.VK_ENTER && e.isControlDown())
{
try {
send();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} });
UDP优化-GUI界面聊天(代码优化)
    public void send() throws IOException {
        String message = edit.getText();
        String host = ip.getText();
        host=((host.trim().length()==0)?"255.255.255.255":host);
        DatagramPacket packet = new DatagramPacket(message.getBytes(),
                message.getBytes().length, InetAddress.getByName(host), 9999);
        socket.send(packet);
        String time = getCurrentTime();
        host=(("255.255.255.255").equals(host)?"所有人":host);
        String str = time + "我对" + host + "说:\r\n" + message + "\r\n\r\n";
        show.append(str);
        bw.append(str);
        edit.setText("");
    }
完整代码
package demo2; import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date; public class GUIDemo extends Frame {
TextField ip;
Button send;
Button log;
Button clear;
Button shake;
TextArea show;
TextArea edit;
DatagramSocket socket;
BufferedWriter bw; /**
* 窗体的初始化
*/
public GUIDemo() {
// 基本控件的初始化
init();
try {
socket = new DatagramSocket();
bw=new BufferedWriter(new FileWriter("src/log.txt",true));
} catch (Exception e) {
e.printStackTrace();
}
// 南边panel的初始化
sourceMade();
// 中间panel的初始化
centerMade();
// 事件添加
event();
} /**
* 中间panel构建
*/
public void centerMade() {
Panel center = new Panel();
center.setLayout(new BorderLayout());
show = new TextArea();
show.setEditable(false);
show.setFont(new Font("xxx", Font.PLAIN, 15));
edit = new TextArea();
edit.setFont(new Font("xxx", Font.PLAIN, 15));
center.add(show, BorderLayout.CENTER);
center.add(edit, BorderLayout.SOUTH);
this.add(center, BorderLayout.CENTER); } /**
* 南边窗体初始化
*/
public void sourceMade() {
Panel source = new Panel();
ip = new TextField(15);
ip.setText("192.168.28.1");
send = new Button("发送");
log = new Button("记录");
clear = new Button("清屏");
shake = new Button("震动");
source.add(ip);
source.add(send);
source.add(log);
source.add(clear);
source.add(shake);
this.add(source, BorderLayout.SOUTH);
} public void init() {
this.setLocation(500, 500);
this.setSize(400, 600);
new Receive().start();
this.setVisible(true);
} public void event() {
// 关闭窗体事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
socket.close();
System.exit(0);
}
}); // 发送事件
send.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
send();
} catch (IOException e1) {
e1.printStackTrace();
}
} }); // 记录事件
log.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
logFile();
} catch (Exception e1) {
e1.printStackTrace();
}
} }); // 清屏事件
clear.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
show.setText("");
} }); // 震动事件
shake.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
try {
send(new byte[]{-1},ip.getText());
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
//快捷键发送
edit.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
//CTRL+回车====》发送信息
if(e.getKeyChar()==KeyEvent.VK_ENTER && e.isControlDown())
{
try {
send();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} });
} public void logFile() throws Exception {
bw.flush();
//获取输入流
FileInputStream fis=new FileInputStream("src/log.txt");
//创建缓冲区
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int len;
byte arr[]=new byte[8192];
while((len=fis.read(arr))!=-1)
{
baos.write(arr,0,len);
}
String str=baos.toString();
show.setText(str); } public void shake() {
int x=getLocation().x;
int y=getLocation().y;
for(int i=0;i<3;i++)
{
try {
this.setLocation(x+10,y+10);
Thread.sleep(20);
this.setLocation(x+10,y-10);
Thread.sleep(20);
this.setLocation(x-10,y+10);
Thread.sleep(20);
this.setLocation(x-10,y-10);
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setLocation(x,y);
} public void send(byte[] arr,String ip) throws IOException {
DatagramPacket packet = new DatagramPacket(arr,
arr.length, InetAddress.getByName(ip), 9999);
socket.send(packet); } public void send() throws IOException { String message = edit.getText();
String host = ip.getText();
host=((host.trim().length()==0)?"255.255.255.255":host);
DatagramPacket packet = new DatagramPacket(message.getBytes(),
message.getBytes().length, InetAddress.getByName(host), 9999);
socket.send(packet); String time = getCurrentTime();
host=(("255.255.255.255").equals(host)?"所有人":host);
String str = time + "我对" + host + "说:\r\n" + message + "\r\n\r\n";
show.append(str);
bw.append(str);
edit.setText("");
} private String getCurrentTime() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
return sdf.format(date);
} public static void main(String[] args) {
GUIDemo demo = new GUIDemo();
} private class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(9999);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true) {
socket.receive(packet);
String message = new String(packet.getData(), 0,
packet.getLength());
if(packet.getData()[0]==-1&&packet.getLength()==1)
{
shake();
continue;
} String time = getCurrentTime();
String ipstr = packet.getAddress().getHostAddress();
String str = time + " " + ipstr + " 对我说:\r\n" + message
+ "\r\n\r\n";
show.append(str);
bw.append(str);
}
} catch (Exception e) {
e.printStackTrace();
} }
} }
最终界面

封装双击可运行jar包
(1)选中涉及到的java文件

(2)右击,导出
(3)JavFile

(4)next(选择保存路径)

(5)next--next--(选取main所在类)

(6)finash

网络编程-UDP的更多相关文章
- c/c++  网络编程 UDP 设定MTU
		网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ... 
- c/c++  网络编程 UDP up/down 网卡
		网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ... 
- c/c++  网络编程 UDP 改变网关和网卡名字
		网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ... 
- c/c++ 网络编程 UDP 改变网卡的硬件地址
		网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ... 
- c/c++ 网络编程 UDP 改变IP地址
		网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ... 
- c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息
		网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ... 
- c/c++ 网络编程 UDP 主机网络信息取得
		网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ... 
- c/c++ 网络编程 UDP 发送端 bind 作用
		网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目 ... 
- Socket网络编程-UDP编程
		Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ... 
- java 网络编程  UDP TCP
		网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: ... 
随机推荐
- ShareSDK入门指南:Android 10分钟快速集成
			ShareSDK 官方已提供Android 快速集成教程,以官方教程为参考,本文重点指导大家在集成中遇到的问题. Android 快速集成官方教程:http://wiki.mob.com/Androi ... 
- jQuery知识点:attr与prop的区别
			做项目时遇到个莫名的问题,全选的时候仅第一次有效,再次点击全选按钮是无效了,查了查原因,看到篇很不错的文章,问题出在jquery中的attr属性上,这里做下笔记. 原文链接:http://www.cn ... 
- RPC-整体概念
			RPC概述 RPC(Remote Procedure Call),即远程过程调用,是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议,实现调用远程主机上的方法就像调用本地方法一样. ... 
- Sass、Ruby、Nodejs、gulp
			1.Sass文件就是普通的文本文件,不过其文件后缀名有两种,一种为“.sass”:另一种为“.scss”.我们一般用“.scss”就好,至于这两种文件扩展名的区别在于“.sass”是Sass语言文件的 ... 
- python 写 excel 模块 : xlwt
			主要来自:[ python中使用xlrd.xlwt操作excel表格详解 ] 为了方便阅读, 我将原文两个模块拆分为两篇博文: [ python 读 excel 模块: xlrd ] [ python ... 
- 【洛谷 P3842】[TJOI2007]线段(DP)
			裸DP.感觉楼下的好复杂,我来补充一个易懂的题解. f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理,停在右端点的最少步数. 那么转移就很简单了,走完当前行且停到左端点 ... 
- bzoj 3223 裸splay
			裸的splay 今儿写的splay,由于自己刚开始学,发现几个容易漏掉的地方 1:开始给所有的儿子赋值为-1 2:给max[-1]赋值为-maxlongint 3:开始father[root]:=sr ... 
- background-clip,origin属性
			background-clip是新增属性之一,其作用是确定背景的裁剪区域. background-clip语法: background-clip:margin-box | padding-box | ... 
- java.lang.NumberFormatException: multiple points 异常
			平时使用SimpleDateFormat的时候都是在单线程的情况下使用的,今天在改写别人的代码,发现每个类中都会写大量的SimpleDateFormat实例.作为一个程序特有的洁癖开始对代码进行优化. ... 
- Django admin 界面无法加载 CSS 问题解决方案(服务器 Apache 服务器)
			主要原因: 未找到存放静态文件的目录 没有访问目录的权限 基础知识: 在 CentOS 下面,Django 的静态文件存放在目录: /usr/lib/python2./site-packages/dj ... 
