------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Java的基本网络支持

  Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了以编程方式访问Web服务的功能,

而URLDecoder和URLEncoder则提供了普通字符串和application/x-www-form-urlencoded MIME相互转换的静态

方法。

1.使用InetAdress

  Java提供了InetAdress类来代表IP地址,InetAdress下还有两个子类:Inet4Address、Inet6Adress。InetAdress

类没有提供构造器,而是提供了如下两个静态方法来获取InetAdress实例。

1)getByName(String host):根据主机获取对应的InetAdress对象。

2)getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAdress对象。

3)getLocalHost():根据本机IP地址来获取对应的InetAdress对象。

InetAdress还提供了如下三个方法来获取InetAdress实例对应的IP地址和主机名。

3)String getCanonicalHostName():获取此IP地址的全限定域名。

4)String getHostAddress():返回该InetAdress实例对应的IP地址字符串。

5)String getHostName():获取此IP地址的主机名。

6)boolean isReachable(int timeout):用于测试是否可到达该地址。

  下面程序测试了InetAdress类的简单用法。

 package com.socket;

 import java.net.InetAddress;

 public class InetAddressTest {

     public static void main(String[] args) throws Exception {

         // 根据主机名来获取对应的InetAddress实例
InetAddress ipAddress = InetAddress
.getByName("www.4399.com");
//判断是否可达
System.out.println("4399网址是否可达:" + ipAddress.isReachable());
//获取该InetAdress实例的IP字符串
System.out.println(ipAddress.getHostAddress());
//获取本机IP地址对应的InetAdress实例
System.out.println("本机IP:"+ InetAddress.getLocalHost());
//根据原始IP地址来获取对应的InetAdress实例
InetAddress local = InetAddress.getByAddress(new byte[]{,,,});
System.out.println("本机是否可达:" + local.isReachable());
//获取该InetAdress实例对应的全限定域名
System.out.println(local.getCanonicalHostName());
} }

运行结果:

4399网址是否可达:true
175.43.124.195
本机IP:XiongXueSong/192.168.1.113
本机是否可达:true
127.0.0.1

2.使用URLDecoder和URLEncoder

  URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的

相互转换。

  在介绍application/x-www-form-urlencoded MIME字符串之前,现在浏览器搜索关键字“黑马程序员”,将看到

下图所示界面。

 

  从图中可以看出当我们所示的关键字包含中文时,这些关键字就会变成如上图所示的“乱码”——这就是所谓的

application/x-www-form-urlencoded MIME字符串。

  当URL地址里包含非西欧字符的字符串时,系统就会将这些非西欧字符串转换成上图所示的特殊字符串。这就

需要使用URLDecoder和URLEncoder类。

1)URLDecoder类包含一个decode(String s, String enc)静态方法,它可以将看上去是乱码的特殊字符串转换

成普通字符串。

2)URLEncoder类包含一个encode(String s, String enc)静态方法,它可以将普通字符串转换成

application/x-www-form-urlencoded MIME字符串。

  下面程序示范了将上图所示地址栏中的“乱码”转换成普通字符串,并示范了如何将普通字符串转换成

application/x-www-form-urlencoded MIME字符串。

 package com.socket;

 import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; public class URLDecoderTest { public static void main(String[] args) throws UnsupportedEncodingException { // 将application/x-www-form-urlencoded MIME字符串转换成普通字符串
String keyString = URLDecoder.decode(
"%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98", "UTF-8");
System.out.println(keyString);
//将普通字符串转换成application/x-www-form-urlencoded MIME字符串
String urlString = URLEncoder.encode("黑马程序员", "UTF-8");
System.out.println(urlString);
} }

运行结果:

黑马程序员
%E9%BB%%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%%

提示:

  包含中文字符串的普通字符串需要转换,转换方法是每个中文字符串栈2个字节,每个字节可以转换成

2个十六进制的数组,所以每个中文字符将转换成“%XX%XX”的形式。

3.使用URLhURLConnection

  URL对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以

是对更为复杂的引用。通常情况下,URL可以由协议名、主机、端口和资源组成,即满足如下格式:

protocol://host:port/resourceName

例如如下的URL地址:

http://www.4399.com

3.TCP编程

客户端:

 package TCPDemo;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException { //创建TCP客户端服务
Socket s = new Socket("localhost", 8000);
//
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
OutputStream out = s.getOutputStream();
out.write(line.getBytes()); byte[] buf = new byte[1024];
InputStream in = s.getInputStream();
in = s.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ": " + text);
} } }

服务端:

 package TCPDemo;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器套接字,端口号必须明确
ServerSocket serverSocket = new ServerSocket(8000); //监听来自客户端的套接字
Socket socket = serverSocket.accept();
while (true) {
try { String ip = socket.getInetAddress().getHostAddress();
byte[] buf = new byte[1024]; InputStream in = socket.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(ip + ":" + text); OutputStream out = socket.getOutputStream();
out.write("已连接".getBytes());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
} }
} }

运行结果:

4.UDP编程

客户端

 package TCPDemo;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器套接字,端口号必须明确
ServerSocket serverSocket = new ServerSocket(8000); while (true) {
//监听来自客户端的套接字
try {
Socket socket = serverSocket.accept(); String ip = socket.getInetAddress().getHostAddress();
byte[] buf = new byte[1024]; InputStream in = socket.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(ip + ":" + text); OutputStream out = socket.getOutputStream();
out.write("已连接".getBytes());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
} }
} }

服务端

 package UDPDemo;

 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPServer { public static void main(String[] args) throws IOException {
System.out.println("开启Server。。。。。"); //建立接收端的UDPSocket服务,必须明确端口号
DatagramSocket ds = new DatagramSocket(8888);
while (true) { //创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//使用接收方法将接收到的数据存储到数据包中
ds.receive(dp);
//对数据进行解析
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(), 0 , dp.getLength());
System.out.println(ip + ": " + port + ": " + text);
}
} }

运行结果:

Java——(十)网络编程的更多相关文章

  1. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  2. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  3. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  4. 20145325张梓靖 实验五 "JAVA的网络编程"

    20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ...

  5. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  6. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  7. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  8. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  9. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

  10. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

随机推荐

  1. EF自动生成的(T4模板) 关联属性元数据修改

    为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据  [ ...

  2. Servlet 是否线程安全 看完便知

    Servlet 是否线程安全 看完便知 转自:http://blog.sina.com.cn/s/blog_6448959f0100kct7.html     摘 要:介绍了Servlet多线程机制, ...

  3. PHP之路——Redis安装

    windows: redis下载链接:https://github.com/ServiceStack/redis-windows 然后编辑redis.windows.conf文件,我看网上有的教程说编 ...

  4. jQuery设置按钮被点击状态

    js和jquery如何使按钮失效,很简单,只要设置disabled属性为true即为不可用状态即可 1.JS方法一: document.getElementByIdx("btn") ...

  5. ld: symbol dyld_stub_binding_helper not found, normally in crt1.o/dylib1.o/bundle1.o for architecture i386

    就是选择的运行版本太低了,点击项目,project,把iOS DeployMent Target改为比较高的版本就行

  6. 【UVA1633】禁止的回文串(状压DP)

    题意: 输入正整数n和k(1<=n<=400,1<=k<=10),求长度为n的01串中有多少个不含长度至少为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001,01 ...

  7. android 通过eclipse混淆代码 打包 + proguard 总结

    android应用程序的混淆打包 1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示: target=android- ...

  8. Google Map API学习1

    这一段时间公司一个新产品上线, 做超市代购的 这样,就需要计算每个门店也就是超市,距离小区之间的距离. 我们用的是Google Map 1.批量对地址进行编码,也就是将地址批量转化成对应的Goole ...

  9. Spark SQL利器:cacheTable/uncacheTable

    Spark相对于Hadoop MapReduce有一个很显著的特性就是“迭代计算”(作为一个MapReduce的忠实粉丝,能这样说,大家都懂了吧),这在我们的业务场景里真的是非常有用.   假设我们有 ...

  10. Linux学习笔记23——取消线程

    一 相关函数 1 发送终止信号 #include <pthread.h> int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...