Java网络编程技术2
3. UDP数据报通信
UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket。这个数据报包必须知道自己来自何处,以及打算去哪里。所以本身必须包含IP地址、端口号和数据内容。
3.1 示例程序——用UDP实现的聊天程序
用UDP协议通信不需要使用服务器,所以用于聊天的程序只要写一个,分别在不同的机器上运行就可以了,而无须写成服务端和客户端两种形式。
例9. 用UDP实现的聊天程序示例。
- package Net.UDPchat;
- import java.awt.BorderLayout;
- import java.awt.Container;
- import java.awt.FlowLayout;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.IOException;
- import java.net.*;
- import javax.swing.*;
- public class UDPchat implements ActionListener,Runnable {
- JFrame jf;
- JLabel jl1,jl2,jl3;
- JTextField recPortText,sendPortText,IPText,msgText;
- JButton startBtn,sendBtn;
- JTextArea showArea;
- JScrollPane jsp;
- JPanel jp1,jp2;
- Container con;
- Thread thread = null;
- DatagramSocket receiveSocket,sendSocket;
- DatagramPacket receivePack,sendPack;
- private InetAddress sendIP;
- private int sendPort,recPort;
- private byte inBuf[],outBuf[];
- private static final int BUFSIZE = 1024;
- public UDPchat(){
- jf = new JFrame("聊天————UDP协议");
- jl1 = new JLabel("接收端口号:");
- jl2 = new JLabel("发送端口号:");
- jl3 = new JLabel("对方的地址:");
- recPortText = new JTextField();
- recPortText.setColumns(5);
- sendPortText = new JTextField();
- sendPortText.setColumns(5);
- IPText = new JTextField();
- IPText.setColumns(8);
- msgText = new JTextField();
- msgText.setColumns(40);
- msgText.setEditable(false);
- msgText.addActionListener(this);
- startBtn = new JButton("开始");
- startBtn.addActionListener(this);
- sendBtn = new JButton("发送");
- sendBtn.setEnabled(false);
- sendBtn.addActionListener(this);
- showArea = new JTextArea();
- showArea.setEditable(false);
- showArea.setLineWrap(true); //自动换行
- jsp = new JScrollPane(showArea);
- jp1 = new JPanel();
- jp2 = new JPanel();
- jp1.setLayout(new FlowLayout());
- jp2.setLayout(new FlowLayout());
- jp1.add(jl1);
- jp1.add(recPortText);
- jp1.add(jl2);
- jp1.add(sendPortText);
- jp1.add(jl3);
- jp1.add(IPText);
- jp1.add(startBtn);
- jp2.add(msgText);
- jp2.add(sendBtn);
- con = jf.getContentPane();
- con.add(jp1, BorderLayout.NORTH);
- con.add(jsp, BorderLayout.CENTER);
- con.add(jp2, BorderLayout.SOUTH);
- jf.setSize(600, 400);
- jf.setLocation(300, 200);
- jf.setVisible(true);
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- //在线程中接收数据
- public void run() {
- String str;
- while(true){
- try {
- receiveSocket.receive(receivePack);
- str = new String(receivePack.getData(),0,receivePack.getLength());
- showArea.append("对方说:"+str+"\n");
- } catch (IOException e) {
- showArea.append("接收数据出错!\n");
- }
- }
- }
- public void actionPerformed(ActionEvent e) {
- try {
- if(e.getSource()==startBtn){
- inBuf = new byte[BUFSIZE];
- sendPort = Integer.parseInt(sendPortText.getText());
- recPort = Integer.parseInt(recPortText.getText());
- sendIP = InetAddress.getByName(IPText.getText());
- sendSocket = new DatagramSocket();
- //创建接收数据包
- receivePack = new DatagramPacket(inBuf,BUFSIZE);
- //指定接收数据的端口
- receiveSocket = new DatagramSocket(recPort);
- //创建线程准备接收对方的信息
- thread = new Thread(this);
- thread.setPriority(Thread.MIN_PRIORITY);
- thread.start();
- msgText.setEditable(true);
- sendBtn.setEnabled(true);
- startBtn.setEnabled(false);
- }else{ //按下了“发送”按钮或回车键
- outBuf = msgText.getText().getBytes();
- //组装要发送的数据
- sendPack = new DatagramPacket(outBuf,outBuf.length,sendIP,sendPort);
- //发送数据
- sendSocket.send(sendPack);
- showArea.append("我说:"+msgText.getText()+"\n");
- msgText.setText(null);
- }
- } catch (NumberFormatException e1) {
- e1.printStackTrace();
- } catch (UnknownHostException e1) {
- showArea.append("无法连接到指定地址\n");
- } catch (SocketException e1) {
- showArea.append("无法打开指定端口\n");
- } catch (IOException e1) {
- showArea.append("发送数据失败!\n");
- }
- }
- public static void main(String[] args) {
- new UDPchat();
- }
- }
4. Java网络编程的新特性(jdk1.7)
4.1 轻量级的HTTP服务
例10. HTTP服务实现的实例。
- package Net.http;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.io.*;
- import com.sun.net.httpserver.HttpExchange;
- import com.sun.net.httpserver.HttpHandler;
- import com.sun.net.httpserver.HttpServer;
- import com.sun.net.httpserver.spi.HttpServerProvider;
- public class HTTPServer {
- public static void main(String[] args) throws Exception {
- //通过HttpServerProvider的静态方法provider,获取HttpServerProvider的对象
- HttpServerProvider httpServerProvider = HttpServerProvider.provider();
- //通过InetSocketAddress类,绑定8080作为服务端口
- InetSocketAddress addr = new InetSocketAddress(8088);
- //调用createHttpServer,创建HTTP服务
- HttpServer httpServer = httpServerProvider.createHttpServer(addr, 1);
- //指定HTTP服务的路径
- httpServer.createContext("/myapp/", new MyHttpHandler());
- httpServer.setExecutor(null);
- //启动服务执行
- httpServer.start();
- //输出服务开始的信息
- System.out.println("started");
- }
- static class MyHttpHandler implements HttpHandler {
- //声明抛出异常
- public void handle(HttpExchange httpExchange) throws IOException {
- // 返回客户端的一个字符串
- String response = "This is a simple HTTP Server!";
- // 返回HTTP访问的状态码
- httpExchange.sendResponseHeaders(200, response.length());
- //将返回结果信息输出到客户端
- OutputStream out = httpExchange.getResponseBody();
- out.write(response.getBytes());
- out.close();
- }
- }
- }
上述代码是一个可直接运行的Java程序,启动程序运行后,在浏览地址栏中输入访问地址:http://localhost:8088/myapp/,就可以打开页面。
httpExchange.sendResponseHeaders(int code, int length);其中的code是Http响应的返回值,比如404、403、500等。length指的是response的长度,以字节为单位。
5. IPv6网络应用程序的开发
5.1 获取本机IPv6地址
对地址进行过滤,选出确实可用的地址。下述代码实现了这一功能,思路是遍历网络接口的各个地址,直至找到符合要求的地址。
例11. 通过Java程序获取本机的IPv6地址。
- package Net.http;
- import java.net.*;
- import java.util.Enumeration;
- import java.io.IOException;
- public class GetIPv6Add {
- public static String getLocalIPv6Address() throws IOException{
- InetAddress inetAddress = null;
- //定义一个枚举变量,列出所有的网卡信息
- Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
- outer:
- //遍历所有的网卡,从中找到包含IPv6的地址信息
- while(networkInterfaces.hasMoreElements()){
- Enumeration<InetAddress> inetAds = networkInterfaces.nextElement().getInetAddresses();
- while(inetAds.hasMoreElements()){
- //判断是否是IPv6地址
- if(inetAddress instanceof Inet6Address && !isReservedAddr(inetAddress)){
- break outer;
- }
- }
- }
- String ipAddr = inetAddress.getHostAddress();
- //过滤掉非地址信息的符号,有些Windows平台上,IP地址的版本信息后面跟着一个%,因而要去掉
- int index = ipAddr.indexOf("%");
- if(index>0){
- ipAddr = ipAddr.substring(0, index);
- }
- return ipAddr;
- }
- /**
- * 过滤本机特殊IP地址
- * @param inetAddr(传入的IP地址作为参数)
- * @return(对传入的IP地址进行判断,返回判断结果
- */
- private static boolean isReservedAddr(InetAddress inetAddr){
- if(inetAddr.isAnyLocalAddress() || inetAddr.isLinkLocalAddress() || inetAddr.isLoopbackAddress()){
- return true;
- }
- return false;
- }
- public static void main(String[] args) {
- try {
- System.out.println(getLocalIPv6Address());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
注意:在windows平台上,取得的IPv6地址后面可能跟了一个百分号加数字。这里的数字是本机网络适配器的编号。这个后缀并不是IPv6标准地址的一部分,可以去除。
Java网络编程技术2的更多相关文章
- Java网络编程技术1
1. Java网络编程常用API 1.1 InetAddress类使用示例 1.1.1根据域名查找IP地址 获取用户通过命令行方式指定的域名,然后通过InetAddress对象来获取该域名对应的IP地 ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 【转】JAVA 网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- java网络编程+通讯协议的理解
参考: http://blog.csdn.net/sunyc1990/article/details/50773014 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很 ...
- 第62节:探索Java中的网络编程技术
前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
随机推荐
- win10字体大小设置
有时图形化界面不能正常显示,需要改变字体大小来查看 更改字体大小: 更改字体:
- customPage.class.php可添加js事件的分页类
用于ajax动态加载数据的分页类,分页事件可以动态添加,去除了a链接中的href地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 如何快速分析出现性能问题的Linux服务器
Brendan Gregg曾经分享过当遇到一个系统性能问题时,如何利用登录的前60秒对系统的性能情况做一个快速浏览和分析,主要包括如下10个工具,这是一个非常有用且有效的工具列表.本文将详细介绍这些命 ...
- OptParse选项工具模块
OptParse是一个从Python2.3版本起引入的一个编写命令行工具模块,示例如下 ######example.py###### import optparse if __name__ == &q ...
- splice() 的用法
splice splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素: var arr = ['Microsoft', 'Apple', ' ...
- web服务端安全之分布式拒绝服务攻击
一.DDOS攻击的原理分布式拒绝服务,Distributed Denial of Service,利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务.通过大量合法的请 ...
- [ 转载 ] Java中常用的设计模式
Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个 ...
- pygame系列_pygame安装
在接下来的blog中,会有一系列的文章来介绍关于pygame的内容,所以把标题设置为pygame系列 在这篇blog中,主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是 ...
- poj 3041 Asteroids 最小点覆盖/最大匹配
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16242 Accepted: 8833 Descriptio ...
- HTML的各个标签的默认样式
head{ display: none } body{ margin: 8px;line-height: 1.12 } button, textarea,input, object,select { ...