java 之UDP编程
大白话:每一台电脑都有自己的ip地址,向指定的ip地址发数据,数据就发送到了指定的电脑。UDP通信只是一种通信方式而已,其特点就不多说。有了ip地址数据就能发送到指定的电脑了,但是呢!我把数据发送到电脑了,电脑中的哪个程序接收呢。不知道亲们知不知道,其实每一个网络软件都有自己的通信端口,像qq,酷狗音乐的下载端口等等。现在知道了吧,向指定的ip地址和指定的端口发数据,才能发送到指定的程序上(当然是我们自己做的程序)。
我们要做两个程序发送端和接收端,先做发送端吧
java提供了专门用于UDP通信的类DatagramSocket;该类有DatagramSocket(int port)的构造方法---可以设定该程序通信的的端口(就像上面说的有ip了还需要端口,这是设定该程序的通信端口);该类提供了发送数据包的方法send(DatagramPacket p),接收数据包的方法receive(DatagramPacket p)
那么DatagramSocket sendDatagramSocket = new DatagramSocket(10000);
sendDatagramSocket .send(DatagramPacket p);这两句就完成了,第一句设定了发送端的通信端口,第二句,发送数据
就缺一点发送到哪里!!往下看
为什么叫数据包呢!上面不是说了,要想通信成功必须向指定的ip地址和指定的端口发数据,发送的时候数据被打包了,里面包含了要发送到的ip地址,端口,和想发的数据(被打包了),注意send(DatagramPacket p)里面的DatagramPacket p,你查一下java的中文api帮助文档就会知道DatagramPacket是一个类,他有一个构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 文档中的解释----构造数据报包,用来将长度为 length 的包发送到指定主机(指定ip地址)上的指定端口号;第一个参数byte[] buf发送的数据,类型为byte[],第二个参数int length,发送数据的长度,第三个InetAddress address发送的ip地址,类型为InetAddress ,第四个端口号。
好那么我先写一个数据String string = "yangfengwu";然后转化一下byte[] by = string.getBytes();意思是转化成字符数组
相当于byte[] by ={'y','a','n','g','f','e','n','g','w','u'};不要嫌麻烦,这样写好处大大的有,如果做界面开发,文本框中我们所传的数据都是字符串类型的!!
好接着DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),8080);
好说一下这个InetAddress.getByName("192.168.32.1")。InetAddress是一个java中的类,他就是专门操作ip的,列如
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());这两句就可以打印出本机的名称和ip地址
我们用getByName(String host)该方法的作用----在给定主机名的情况下确定主机的 IP 地址。
主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。
InetAddress ip = InetAddress.getByName("192.168.32.1");
DatagramPacket sendPscket = new DatagramPacket(by, by.length, ip ,8080);
sendDatagramSocket .send(DatagramPacket p);     发送  sendDatagramSocket .send(sendPscket );
下面是完整的发送端程序
package server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Server_test {
	public static void main(String[] str)
	{
		try 
		{
			//创建DatagramSocket 对象,并指定该程序的通信端口为10000
			DatagramSocket sendDatagramSocket = new DatagramSocket(10000);
			//确定要发送的消息
			String string = "yangfengwu";
			//转成字符数组类型
			byte[] by = string.getBytes();
			//确定要发送的地址
			//InetAddress ip = InetAddress.getLocalHost();//如果是自己电脑测试可以这样得到本机地址,也可以自己查自己的ip地址
//InetAddress ip = InetAddress.getByName("192.168.32.1");
//确定要发送的端口
			int port = 8080;
			//创建发送类型的数据包,这个数据包包含了要发往的ip地址和端口
			DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),port);
			//通过DatagramSocket 的send方法发送数据
			sendDatagramSocket.send(sendPscket);
			//创建接收缓冲区
			byte[] bt = new byte[1024];
			//创建接收类型的数据包
//DatagramPacket(byte[] buf, int length)构造 DatagramPacket,用来接收长度为
length 的数据包
			DatagramPacket receivePacket = new DatagramPacket(bt, bt.length);
			//通过DatagramSocket 的receive方法发送数据
			sendDatagramSocket.receive(receivePacket);
			//打印---数据包
			String daString = new String(receivePacket.getData(),0,receivePacket.getLength());//getData()方法是返回数据缓冲区
			System.out.println(daString);
			//关闭接收
			sendDatagramSocket.close();
		} 
		catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
}
下面是完整的接收端程序
package client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client_test {
	public static void main(String[] str) 
	{
		try 
		{
			//确定端口
			int port = 8080;
			//创建DatagramSocket 对象,并指定该程序的通信端口为8080
			DatagramSocket receiveSocket = new DatagramSocket(port);
			while(true)
			{
				//创建接收缓冲区
				byte[] by = new byte[1024];
				//创建接收数据包
				DatagramPacket receivePacket = new DatagramPacket(by, by.length);
				//接收数据
				receiveSocket.receive(receivePacket);
				//解析消息并打印数据
				String string =new String(receivePacket.getData(),0,receivePacket.getLength());
				System.out.println(string);
				//通过数据包也可以解析ip、和端口,打印
				InetAddress ipAddress = receivePacket.getAddress();
				int receivePort = receivePacket.getPort();
				System.out.println(ipAddress);
				System.out.println(receivePort);
				//发送数据
				String aaString = "123";
				byte[] bb = aaString.getBytes();
				//创建发送类型的数据包
				DatagramPacket sendPscket = new DatagramPacket(bb, bb.length,InetAddress.getByName("192.168.32.1"), 10000);
				receiveSocket.send(sendPscket);
			}
//receiveSocket.close();
		} 
		catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
}
java 之UDP编程的更多相关文章
- Java Socket UDP编程
		package com; import java.io.IOException; import java.net.*; /** * UDP Client * * Created by Administ ... 
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
		福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ... 
- Java入门网络编程-使用UDP通信
		程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ... 
- java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)
		java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ... 
- Java TCP/UDP网络通信编程
		本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ... 
- 二十三、Java基础--------网络编程
		Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ... 
- JAVA的网络编程
		网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ... 
- JAVA的面向对象编程--------课堂笔记
		面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ... 
- Java Socket 网络编程心跳设计概念
		Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ... 
随机推荐
- C语言字符串读入函数笔记
			gets(str)函数和scanf("%s",str)区别: 转自:https://zhidao.baidu.com/question/290403568.html 二者都是从终端 ... 
- C# 6 元组应用 Part 1:方便的字典工厂方法
			首先是简单的实现: public static class CollectionExtensions { public static IDictionary<TKey, TValue> M ... 
- Android系统启动流程(一)解析init进程启动过程
			整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ... 
- Django基础篇--用户权限管理和组管理
			Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ... 
- JS列表
			promise 引用类型/值类型 ----- 对比python可变对象/不可变对象 原型继承 
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
			一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ... 
- oracle中nvarchar2字符集不匹配
			oracle当多表union时遇到nvarchar2类型时报错 字符集不匹配对使用nvarchar的地方,加上 to_char( nvarchar 的变量或字段 ) 如:select to_char( ... 
- win10系统安装两个版本的python,该怎么安装Django
			最近遇到一个问题,系统上安装了python2,7 和python3.5两个版本,然后使用命令:pip install Django 安装Django后却发现以下情况: Traceback (most ... 
- (13)Python文件操作
- go标准库的学习-strings-字符串操作
			参考https://studygolang.com/pkgdoc 导入方式: import "strings" strings包实现了用于操作字符的简单函数. 常用的几个函数: f ... 
