• 网络编程之UDP编程

UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报。值得注意的是:UDP编程必须先由客户端发出信息。一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中)。端口与协议相关,所以TCP的3000端口与UDP的3000端口不是同一个端口。关于这种方式了解下就好了,实际编码中反正我是从来没有用到过。





以下代码实现了使用DatagramSocket发送和接受数据:

import java.net.*;
import java.io.*; public class UdpServer
{
public static final int PORT = 30000;
// 定义每个数据报的最大大小为4K
private static final int DATA_LEN = 4096;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket;
// 定义一个字符串数组,服务器发送该数组的的元素
String[] books = new String[] { "LinkinPark", "NightWish", "林肯公园", "夜愿。。。" }; public void init() throws IOException
{
// 创建DatagramSocket对象
DatagramSocket socket = null;
try
{
socket = new DatagramSocket(PORT);
// 采用循环接受数据
for (int i = 0; i < 1000; i++)
{
// 读取Socket中的数据,读到的数据放入inPacket封装的数组里。
socket.receive(inPacket);
// 判断inPacket.getData()和inBuff是否是同一个数组
System.out.println(inBuff == inPacket.getData());
// 将接收到的内容转成字符串后输出
System.out.println(new String(inBuff, 0, inPacket.getLength()));
// 从字符串数组中取出一个元素作为发送的数据
byte[] sendData = books[i % 4].getBytes();
// 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的
// 源SocketAddress作为目标SocketAddress创建DatagramPacket。
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());
// 发送数据
socket.send(outPacket);
}
}
finally
{
if (socket != null)
{
socket.close();
}
}
} public static void main(String[] args) throws IOException
{
new UdpServer().init();
}
}
import java.net.*;
import java.io.*;
import java.util.*; public class UdpClient
{
// 定义发送数据报的目的地
public static final int DEST_PORT = 30000;
public static final String DEST_IP = "127.0.0.1";
// 定义每个数据报的最大大小为4K
private static final int DATA_LEN = 4096;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket = null; public void init() throws IOException
{
// 创建一个客户端DatagramSocket,使用随机端口
DatagramSocket socket = null;
try
{
socket = new DatagramSocket();
// 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT);
// 创建键盘输入流
Scanner scan = new Scanner(System.in);
// 不断读取键盘输入
while (scan.hasNextLine())
{
// 将键盘输入的一行字符串转换字节数组
byte[] buff = scan.nextLine().getBytes();
// 设置发送用的DatagramPacket里的字节数据
outPacket.setData(buff);
// 发送数据报
socket.send(outPacket);
// 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。
socket.receive(inPacket);
System.out.println(new String(inBuff, 0, inPacket.getLength()));
}
}
finally
{
if (socket != null)
{
socket.close();
}
}
} public static void main(String[] args) throws IOException
{
new UdpClient().init();
}
}

  • 最后介绍下代理服务器:

什么是代理服务器?

代理服务器的功能就是代理网络用户去获得网络信息。代理服务器就是介于浏览器和web服务器之间的一台服务器,有了这个代理服务器之后,浏览器不是直接到web服务器去获得页面信息而是向刚才那台向刚才我们加的那一台代理服务器去发送请求,由代理服务器去取的网页数据然后发送给网络服务器。其中呢关于网络服务器还有一个最大的好处就是缓存,总结一下代理服务器有如下功能:

1,突破自身IP限制,对外隐藏自身的IP地址,那么这样子就会安全一些

2,提高访问速度,因为他具有强大的缓存功能(cache)





相关贴出2篇代码,了解下就好了:

import java.io.*;
import java.net.*;
import java.util.*; /**
*
* @version 1L
* @author LinkinPark
* @since 2015-2-11
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^以URLConnection为例介绍如何在URLConnection中使用代理服务器
*/
public class ProxyTest
{
// 下面是代理服务器的地址和端口,
// 换成实际有效的代理服务器的地址和端口
final String PROXY_ADDR = "129.82.12.188";
final int PROXY_PORT = 3124;
// 定义需要访问的网站地址
String urlStr = "http://www.crazyit.org"; public void init()
throws IOException , MalformedURLException
{
URL url = new URL(urlStr);
// 创建一个代理服务器对象
Proxy proxy = new Proxy(Proxy.Type.HTTP
, new InetSocketAddress(PROXY_ADDR , PROXY_PORT));
// 使用指定的代理服务器打开连接
URLConnection conn = url.openConnection(proxy);
// 设置超时时长。
conn.setConnectTimeout(5000);
try(
// 通过代理服务器读取数据的Scanner
Scanner scan = new Scanner(conn.getInputStream(), "utf-8");
PrintStream ps = new PrintStream("index.htm"))
{
while (scan.hasNextLine())
{
String line = scan.nextLine();
// 在控制台输出网页资源内容
System.out.println(line);
// 将网页资源内容输出到指定输出流
ps.println(line);
}
}
} public static void main(String[] args) throws IOException, MalformedURLException
{
new ProxyTest().init();
}
}
import java.io.*;
import java.net.*;
import java.util.*; /**
*
* @version 1L
* @author LinkinPark
* @since 2015-2-11
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^通过改变系统属性来改变默认的代理服务器
*/
public class ProxySelectorTest
{
// 下面是代理服务器的地址和端口,
// 随便一个代理服务器的地址和端口
final String PROXY_ADDR = "139.82.12.188";
final int PROXY_PORT = 3124;
// 定义需要访问的网站地址
String urlStr = "http://www.crazyit.org"; public void init()
throws IOException , MalformedURLException
{
// 注册默认的代理选择器
ProxySelector.setDefault(new ProxySelector()
{
@Override
public void connectFailed(URI uri
, SocketAddress sa, IOException ioe)
{
System.out.println("无法连接到指定代理服务器!");
}
// 根据"业务需要"返回特定的对应的代理服务器
@Override
public List<Proxy> select(URI uri)
{
// 本程序总是返回某个固定的代理服务器。
List<Proxy> result = new ArrayList<>();
result.add(new Proxy(Proxy.Type.HTTP
, new InetSocketAddress(PROXY_ADDR , PROXY_PORT)));
return result;
}
});
URL url = new URL(urlStr);
// 没有指定代理服务器、直接打开连接
URLConnection conn = url.openConnection(); //①
// 设置超时时长。
conn.setConnectTimeout(3000);
try(
// 通过代理服务器读取数据的Scanner
Scanner scan = new Scanner(conn.getInputStream());
PrintStream ps = new PrintStream("index.htm"))
{
while (scan.hasNextLine())
{
String line = scan.nextLine();
// 在控制台输出网页资源内容
System.out.println(line);
// 将网页资源内容输出到指定输出流
ps.println(line);
}
}
} public static void main(String[] args) throws IOException, MalformedURLException
{
new ProxySelectorTest().init();
}
}
  • 在这里顺便介绍一下URL

URL:统一资源定位器。它是指向互联网资源的指针。资源可以是简单的文件和目录,也可以是对更加复杂的对象的引用。

值得注意的是,URL一般由协议名,主机,端口和资源组成。比如:http://localhost:8080/tzTaskManage/Login.jsp





最后贴出一段普通的下载程序结束网络编程。前面的TCP的常用类中也有一篇是下载的代码,那里的代码稍微复杂一点,那里实现了多线程下载的功能,当然还可以更加复杂一点,就是在那个的基础上再提供一个配置文件,用来记录每一个线程下载到了什么地方了,下载继续的时候就可以从那里开始继续,这也就是断点下载。以下代码是普通下载的核心:

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; public class DownLoad
{
public static void main(String[] args) throws Exception
{
String str = "http://localhost/project_document.zip";
URL url = new URL(str);//上句指定下载的地址和文件
URLConnection urlConn = url.openConnection();
urlConn.connect();//获得连接然后在获得输入流
InputStream is = urlConn.getInputStream();
FileOutputStream fos = new FileOutputStream("/home/sd0807/down.zip");
byte[] buf = new byte[4096]; //上句指定下载的地址和下载后的名称
int length = 0;
while ((length = is.read(buf)) != -1)
{
fos.write(buf, 0, length);
}
fos.close();
is.close();
}
}

网络编程之UDP编程的更多相关文章

  1. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  2. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  3. linux网络编程之socket编程(十四)

    经过令国鸡冻的APEC会之后,北京的冬天终于不冷了,有暖气的日子就是倍儿爽呀~~洗完热水澡,舒服的躺在床上欢乐地敲打着键盘,是件多么幸福的事呀,好了,抒发情感后,正题继续. 上节中已经初步学习了UDP ...

  4. 网络编程之UDP

    UDP编程流程:一服务端:1.创建socket.  DatagramSocket socket = new DatagramSocket(8878); 2.创建数据包,用来接收发送的数据包.byte[ ...

  5. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  6. (28)网络编程之UDP

    介绍UDP通信协议的编程之前,先介绍一下网络编程,socket相关的概念: 网络编程:网络编程主要用于解决计算机与计算机(手机平板等)之间的数据传输问题. 网络编程:不需要基于html网页就可以达到数 ...

  7. Python网络编程之socket编程

    什么是Socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

  8. java网络编程之Socket编程

    概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...

  9. python的socket编程之udp编程

    在上篇文章中,仅仅讲述了如何进行了TCP编程,在本章中,将讲述使用udp进行编码,先看如下的代码,服务器端: root@python 513]# cat serverudp.py #!/usr/bin ...

随机推荐

  1. COM学习(四)——COM中的数据类型

    上一次说到,COM为了跨语言,有一套完整的规则,只要COM组件按照规则编写,而不同的语言也按照对应的规则调用,那么就可以实现不同语言间相互调用.但是根据那套规则,只能识别接口,并调用没有参数和返回类型 ...

  2. 高效开发技巧:为什么你下载Git项目这么慢?

    文章首发于[博客园-陈树义],点击跳转到原文<高效开发技巧:为什么你下载Git项目这么慢?>. 笔者所在公司采用的是 GitLab 进行版本管理,但许多同事下载 Git 项目的路径是这样的 ...

  3. vim保存时提示: 无法打开并写入文件

    命名内容已经写入,但是不知怎的就是没法保存,估计是权限不足的问题. 切换到root用户,进行了同样的操作,发现没有该问题了. 经验教训:编辑配置文件时,记得切换到root用户进行编辑.

  4. Linux各种版本

     1.1   Fedora Core和Fedora 一开始总搞不清楚 Fedora Core和Fedora有什么关系?有什么不同,现在终于明白了,自从Fedora Core 第七版开始以后就开始称作F ...

  5. Progressive Web Applications

    Progressive Web Applications take advantage of new technologies to bring the best of mobile sites an ...

  6. GDOI 2016 & APIO 2016 游记

    缓慢施工中...... UPD:APIO游记已烂尾......因为Cu滚粗+生病一直没心情写..过了几天就发现APIO的事都快忘光了...去看KPM的就可以啦 今年apio竟然没和gdoi撞...智障 ...

  7. hdu_1042(模拟大数乘法)

    计算n! #include<cstring> #include<cstdio> using namespace std; ]; int main() { int n; whil ...

  8. python程序的标准输入输出

    1,  A+B Problem : http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1000 #! ...

  9. flume1.8 开发指南学习感悟

    概述: Apache Flume是一个分布式.可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据. 架构及数据流动模型: flume实际上就是一个Agent.Age ...

  10. [国嵌攻略][162][USB协议分析]

    USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...