java网络编程

网络编程基础
网络编程的目的:
直接或间接地通过网络协议与其它计算机进行通讯。
网络编程中有两个主要的问题:
Ø如何准确地定位网络上一台或多台主机
Ø找到主机后如何可靠高效地进行数据传输。

如何实现网络中的主机互相通信:
Ø通信双方地址 【IP地址】
Ø一定的规则(有两套参考模型)
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

Java与Internet ——Java中的网络支持
针对网络通信的不同层次,Java提供的网络功能有四大类:
InetAddress 、URL、Sockets、Datagram。
InetAddress面向的是网络层(IP层),用于标识网络上的硬件资源。
URL面向的应用层,通过URL,Java程序可以直接送出或读入网络上的数据。
Sockets和Datagram面向的则是传输层。
Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以为两个不同的程序通过网络的通信信道进行通信。
Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上。

InetAddress类
l InetAddress类可以用于标识网络上的硬件资源,它提供
了一系列方法以描述、获取及使用网络资源。
lInternet上的主机有两种方式表示地址:
Ø域名(hostName):www.yuanrenhome.com
ØIP 地址(hostAddress):59.53.63.66
InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
InetAddress 类对象含有一个 Internet 主机地址的域名和
IP地址:www.yuanrenhome.com 和 59.53.63.66。
l域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。 -------域名解析

package ch14.inetaddressdemo;
import java.net.InetAddress;
public class InetAddressDemo {
public static void main(String[] args) throws Exception {
InetAddress locAdd = null; // 声明InetAddress对象
InetAddress remAdd = null; // 声明InetAddress对象
locAdd = InetAddress.getLocalHost(); // 得到本地InetAddress对象
remAdd = InetAddress.getByName("www.yuanrenhome.com");
System.out.println("本机IP地址:"
+ locAdd.getHostAddress());// 得到本地IP地址
System.out.println("yuanrenhome的IP地址:"
+ remAdd.getHostAddress());// 得到远程IP地址
System.out.println("本机是否可达:"
+ locAdd.isReachable(5000));
}
}

URL编程
lURL(Uniform Resource Locator):统一资源定位符,它表示
Internet 上某一资源的地址。
通过 URL 我们可以访问 Internet 上的各种网络资源,比如
最常见的 www,ftp 站点。
l浏览器通过解析给定的 URL 可以在网络上查找相应的文
件或其他资源。
URL的基本结构由5部分组成:
Ø<传输协议>://<主机名>:<端口号>/<文件名>
Ø例如: http://192.168.1.100:8080/helloworld/index.jsp

使用URL
在java.net包中,提供了类URL来表示URL。类URL提供了很多
构造方法来生成一个URL对象:
public URL(String spec) 以字符spec指定的地址创建对象
public URL(URL context, String spec) 用URL对象所提供的基本地址和由spec
提供的一个相关路径来创建一个URL对象
public URL(String protocol, String host, String file) 以protocol 、host和
file指定的协议、主机名和文件名创建对象
public URL(String protocol, String host, int port, String file) 以protocol、
host、 port和file指定的协议、主机、端口号和文件名创建对象
以下是一些具体的构造实例:
URL url1 = new URL(“http://www.yuanrenhome.com”);
URL base = new URL(“http://www.yuanrenhome.com”);
URL url2 = new URL(base, “mywork1.html”);
URL url4 = new URL(“http”, “jwc.jxau.edu.cn/”,“1885.html?Category=106”);
URL url5 = new URL(“http”, “www.abc.com”, 8080, “/java/network.html”);

package ch14.urldemo;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
public class URLDemo {
public static void main(String[] args) throws Exception {
URL url = new URL("http", "www.cxjava.cn",
80, "/curriculum.htm"); // 指定操作的URL
InputStream input=url.openStream();//打开输入流,读取URL内容
Scanner scan = new Scanner(input);//实例化Scanner对象
scan.useDelimiter("\n"); // 设置读取分隔符
while (scan.hasNext()) { // 不断读取内容
System.out.println(scan.next()); // 输出内容
}
}
}

一个URL对象生成后,其属性是不能被改变的(与
String对象相似),但可以通过它给定的方法来获取这些
属性:
public String getProtocol():获取该URL的协议名
public String getHost() :获取该URL的主机名
public String getPort() :获取该URL的端口号
public String getPath() :获取该URL的文件路径
public String getFile() :获取该URL的文件名
public String getRef() :获取该URL在文件中的相对位置
public String getQuery() :获取该URL的查询名

package ch14.urldemo;
import java.net.URL;
public class URLMathdDemo {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.myweb.com/download");
System.out.println("Protocol: " + url.getProtocol());
System.out.println("Port: " + url.getPort());
System.out.println("Host: " + url.getHost());
System.out.println("File: " + url.getFile());
System.out.println("Ext:" + url.toExternalForm());
}
}

URLConnection类
通过URL类提供的方法openConnection(),就可以获得一个
URL连接(URLConnection)对象。
public URLConnection openConnection()
通过URL的方法openStream(),只能从网络上读取资源中的数
据。通过URLConnection类,可以在应用程序和URL资源之间进
行交互,既可以从URL中读取数据,也可以向URL中发送数据。
URLConnection类表示了应用程序和URL资源之间的通信连接。

URLConnection类
• 程序可以通过URLConnection实例向该URL发送请求、读取
URL引用的资源。
• 通常创建一个和 URL 的连接,并发送请求、读取此 URL 引用
的资源需要如下几个步骤:
(1)通过调用URL对象openConnection()方法来创建
URLConnection对象。
(2)设置URLConnection的参数和普通请求属性。
(3)如果只是发送GET方式请求,使用connect方法建立和
远程资源之间的实际连接即可;如果需要发送POST方式的
请求,需要获取URLConnection实例对应的输出流来发送请
求参数。
(4)远程资源变为可用,程序可以访问远程资源的头字段、
或通过输入流读取远程资源的数据。

package ch14.urldemo;
import java.net.URL;
import java.net.URLConnection;
public class URLConnectionDemo {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.cxjava.cn"); // 指定操作的URL
URLConnection urlCon = url.openConnection() ; // 建立连接
// 取得内容大小
System.out.println("内容大小:" + urlCon.getContentLength());
// 取得内容类型
System.out.println("内容类型:" + urlCon.getContentType());
// 取得时间
System.out.println("Date: " + new Date(urlCon.getDate()));
// 取得最后修改时间
System.out.println("Last-Modified: "+new
Date(urlCon.getLastModified()));
}
}

编码及解码操作

package ch14.codedemo;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class CodeDemo {
public static void main(String[] args) throws Exception {
String keyWord = "gf 李小龙"; // 要编码的内容
String encod =URLEncoder.encode(keyWord,"UTF-8");//对内容进行编码
System.out.println("编码之后的内容:" + encod);
String decod = URLDecoder.decode(encod,"UTF-8");//对内容进行解码
System.out.println("解码之后的内容:" + decod);
}
}

通讯要素:网络通信协议
 网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速
率、传输代码、代码结构、传输控制步骤、出错控制等制定
标准。
 通信协议分层的思想
由于结点之间联系很复杂,在制定协议时,把复杂成份分解
成一些简单的成份,再将它们复合起来。最常用的复合方式是
层次方式,即同层间可以通信、上一层可以调用下一层,而与
再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

 

TCP/IP协议簇
l传输层协议中有两个非常重要的协议:
Ø 传输控制协议TCP(Transmission Control Protocol)
Ø 用户数据报协议UDP(User Datagram Protocol)。
TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协
议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结
构,即物理链路层、IP层、传输层和应用层。

TCP 和 UDP
TCP协议:
Ø 使用TCP协议前,须先建立TCP连接,形成传输数据通道
Ø 传输前,采用“三次握手”方式,是可靠的
Ø TCP协议进行通信的两个应用进程:客户端、服务端
Ø 在连接中可进行大数据量的传输
Ø 传输完毕,需释放已建立的连接,效率低

UDP协议:
Ø 将数据、源、目的封装成数据包,不需要建立连接
Ø 每个数据报的大小限制在64K内
Ø 因无需连接,故是不可靠的
Ø 发送数据结束时无需释放资源,速度快

TCP程序设计
• 在Java中使用Socket(即套接字)完成TCP程序的开发,使用此类可以方便的建立可靠的、双向的、持续的、点对点的通讯连接。
• 在Socket的程序开发中,服务器端使用ServerSocket等待客户端的连接(类似于监听器),对于Java的网络程序来讲,每一个客户端都使用一个Socket对象表示。

服务器与客户端的通讯
• 在服务器端每次运行时都要使用aceept()方法等待客户端连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才可以向下继续执行,此方法的返回值类型是Socket,每一个Socket都表示一个客户端对象。

服务器端的编程

l服务器程序的工作过程包含以下四个基本的步骤:
Ø调用 ServerSocket(int port) :创建一个服务器端套接字,并
绑定到指定端口上。用于监听客户端的请求。
Ø调用 accept():监听连接请求,如果客户端请求连接(在客户
端连接之前该方法一直阻塞),则接受连接,返回通信套接字
对象。
Ø调用 该Socket类对象的 getOutputStream() 和
getInputStream ():获取输出流和输入流,开始网络数据的发
送和接收。
Ø关闭ServerSocket和Socket对象:客户端访问结束,关闭通信
套接字。

建立服务器程序

import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String args[]) throws Exception {
ServerSocket server = null; // 声明ServerSocket对象
Socket client = null; // 一个Socket对象表示一个客户端
PrintStream out = null; // 声明打印流对象,以向客户端输出
server = new ServerSocket(8888);//服务器在8888端口上等待客户端访问
System.out.println("服务器运行,等待客户端连接");
client = server.accept(); // 程序再此阻塞,等待客户端连接
String str = "hello world!!!"; // 要向客户端输出的信息
// 实例化打印流对象,输出信息
out = new PrintStream(client.getOutputStream());
out.println(str); // 输出信息
out.close(); // 关闭打印流
client.close(); // 关闭客户端连接
server.close(); // 关闭服务器连接
}
};

客户端Socket编程步骤
客户端Socket的工作过程包含以下四个基本的步骤:
Ø创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket
类对象。若服务器端响应,则建立客户端到服务器的通信线路。
若连接失败,会出现异常。
Ø打开连接到 Socket 的输入/出流: 使用 getInputStream()方法
获得输入流,使用 getOutputStream()方法获得输出流,进行数
据传输
Ø按照一定的协议对 Socket 进行读/写操作:通过输入流读取
服务器放入线路的信息(但不能读取自己放入线路的信息),
通过输出流将信息写入线程。
Ø关闭 Socket:断开客户端到服务器的连接,释放线路

编写客户端程序

import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String artsg[]) throws Exception {
Socket client = null; // 声明Socket对象
client = new Socket("localhost", 8888); // 指定连接的主机和端口
BufferedReader buf = null; // 声明BufferedReader对象,接收信息
buf = new BufferedReader(
new InputStreamReader(
client.getInputStream()));// 取得客户端的输入流
String str = buf.readLine(); // 读取信息
System.out.println("服务器端输出内容:" + str);
client.close(); // 关闭Socket
buf.close(); // 关闭输入流
}
};

加入多线程

现阶段TCP的服务器和客户端只能单向对话,有点像
对讲机,要实现一个服务器端服务多个客户端就必
须加入多线程机制。

 

基于多线程的服务器程序

import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String args[]) throws Exception {
ServerSocket server = null; // 声明ServerSocket对象
server = new ServerSocket(8888);//服务器在8888端口上等待客户端访问
System.out.println("服务器运行,等待客户端连接");
boolean flag = true;
while (flag) { // 服务器可以接收到多个用户请求
Socket client = server.accept(); // 程序再此阻塞,等待客户端连接
ThreadServer ts= new ThreadServer(); // 线程子类
ts.setSocket(client);// 传递socket
ts.start(); // 开启线程
}s
erver.close(); // 关闭服务器连接
}
};

服务于服务器端的多线程类

import java.net.*;
import java.io.*;
public class ThreadServer extends Thread{
private Socket client= null;
public void setSocket(Socket client) { this.client= client;}
public void run() throws Exception {
PrintStream out=new PrintStream(client.getOutputStream());//客户端输出流
BufferedReader buf= new BufferedReader(
new InputStreamReader(client.getInputStream()));
boolean temp = true;
while (temp) { // 要一直接收客户端的请求
String str = buf.readLine(); // 接收内容
if ("bye".equals(str)) {
temp = false; // 不再接收
} else {// 线程子类
out.println("Server>>:" + str); // 将内容送回客户端
}
}
out.close();buf.close();client.close();
}
};

 

UDP网络通信

在TCP的所有操作都必须建立可靠的连接,这样一来肯定会浪
费大量的系统性能,为了减少这种开销,在网络中又提供了另
外一种传输协议 —— UDP,不可靠的连接,这种协议在各个聊
天工具中被广泛的应用。
• 在UDP开发中使用DatagramPacket包装一条要发送的信息,之
后使用DatagramSocket用于完成信息的发送操作
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,
系统不保证UDP数据报一定能够安全送到目的地,也不能确
定什么时候可以抵达。
DatagramPacket 对象封装了UDP数据报,在数据报中包含了
发送端的IP地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须
建立发送方和接收方的连接

 

UDP网络通信的流程

流 程:
1. 创建DatagramSocket与DatagramPacket
2. 建立发送端,接收端
3. 建立数据包
4. 调用Socket的发送、接收方法
5. 关闭Socket
发送端与接收端是两个独立的运行程序

UDP客户端 —— UDPClient

import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPClient {
public static void main(String[] args) throws Exception {
DatagramSocket ds = null; // 声明DatagramSocket对象
byte[] buf = new byte[1024]; // 定义接收数据的字节数组
DatagramPacket dp = null; // 声明DatagramPacket对象
ds = new DatagramSocket(9000); // 此客户端在9000端口监听
dp = new DatagramPacket(buf, 1024); // 指定接收数据的长度为1024
System.out.println("等待接收数据。") ; // 输出信息
ds.receive(dp); // 接收数据
String str = new String(dp.getData(), 0, dp.getLength()) + "
from "+ dp.getAddress().getHostAddress()
+ " : " + dp.getPort(); // 接收数据
System.out.println(str); // 输出数据
ds.close(); // 关闭
}
}

编写UDP发送的服务器端程序 —— UDPServer

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String[] args) throws Exception {
DatagramSocket ds = null; // 声明DatagamSocket对象
DatagramPacket dp = null; // 声明DatagramPacket对象
ds = new DatagramSocket(3000); // 服务器端在3000端口监听
String str = "hello world "; // 准备好要发送的信息
//实例化DatagramPacket对象,指定数据内容,数据长度,要发送的目标地址,发送端口
dp = new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("localhost"), 9000);// 此处向客户端所在的9000端
口发送信息
System.out.println("发送信息。") ; // 信息输出
ds.send(dp); // 发送数据报
ds.close(); // 关闭
}
}

总结:

位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。
 

URL 和 URLConnection类提供了最高级网络应用。URL 的网络资源的位置来
同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和
URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或
者把自己的数据传送到网络上去。

 

客户端-服务器是一种最常见的网络应用程序模型。服务器是一个为其客户
端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问
某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一
物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务
器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接
的会话。

 

Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress
对象表示 IP 地址,该对象里有两个字段:主机名(String) 和 IP 地址(int)。

 

类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket
是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提
供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程
中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。

 

 

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值