1、Java网络编程简介
在TCP/IP中有三个最常用的协议有IP、TCP和UDP三大协议。
1.1 IP网间协议:
IP协议是网际层的主要协议,支持网间互连的数据报通信,主要提供的功能有:无连接数据报传送和数据报路由选择和差错控制。
1.2 TCP传输控制协议:
TCP(transmission control protocol) 是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。面向连接的协议。TCP连接时字节流而非报文流。
1.3 UDP用户数据包协议:
UDP(user data protocol) UDP向应用程序提供了一个发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接。
2、URL连接
2.1 URL
统一资源定位符(URL,英语UniformResourceLocator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。
授权部分一般是服务器的名称或IP地址,有时后面还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名@密码:子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
2.2 Java.net包中URL类定义
URL类中定义了许多简单实用的方法,利用它们可以进行一些有关URL的操作。如获取URL属性信息的有getProtocol()方法(获取URL中的传输协议,返回值为String类型)、getHost()方法(获取URL中的主机名称,返回值为String类型)、getPort()方法(获取URL中的端口号,返回值为int类型)、getFile()方法(获取资源的文件名,返回值为String类型)、getRef()方法(获取URL中的参考点,返回值为String类型)以及操作URL资源的openStream()方法(与服务器上的文件建立一个输入流的连接)、toString()方法(将URL的内容转成字符串)、same File()方法(用于比较判断两个URL的数据是否相同)等。
2.3 创建URL对象
(1)new URL(url字符串)
(2)new URL(协议,主机名,文件名或路径)
(3)new URL(协议,主机名,端口号,文件名或路径)
(4)new URL(基准url,文件名或路径)
2.4 Java.net包中URLConnection类
Java语言的java.net.URLConnection类和java.net.URL类一样,它使得编程者能方便地利用URL在Internet上进行网络通信。
URLConnection类中包含了更丰富的方法,可以对服务器上的文件进行更多的处理。URLConnection类的构造方法是URLConnection(URL),可以构造一个对指定URL的连接对象。用URLConnection的构造方法来构造URLConnection类时,并未建立与指定URL的连接,所以还需要使用URLConnection类中的connect()方法建立连接。
在URL类中定义了openConnection()方法,使用URL类中的openConnection方法创建URLConnection对象时,已建立了网络连接,所以不需要再使用connect()方法建立连接了。
2.5 AppletContext接口类
AppletContext类是一个接口类,Applet小程序通过AppletContext接口与环境进行通讯。利用这个类可以从运行Applet小程序的环境中获取信息,而这个环境一般是指浏览器。AppletContext类没有构造方法,但是可以通过Applet类中的getAppletContext()方法获取AppletContext接口,使用Applet类中showStatus()方法可以在浏览器的状态条中显示提示信息,使用showDocument()方法可以通知浏览器在指定窗口中显示另一个URL的内容。
2.6 获取网络属性信息
在Java语言中,通过URL类的getFile()、getHost()、getPort()、getProtocol()、getRef()等方法可以获取一个网站的属性信息。
2.7 创建输入流(InputStream)对象
java.io包中InputStream输入流类是一抽象类,作为其他输入流类的基类,对应着读取字节流信息的基本接口,提供了其所有子类都能调用的方法。
3、 SOCKET连接
3.1 Socket通信的一般结构
socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
在Java语言中,通过创建套接字可以建立与其他机器的连接并创建套接字InputStream和OutputStream流对象,套接字输入/输出流完全可以将连接作为一个I/0流对象来对待。3.2 TCP Socket编程
3.2.1 Socket类
Java.net包中的Socket类用在客户端,在客户端通过构造一个Socket类来建立与服务器的连接。Socket类的连接可以是数据流连接,也可以是数据报连接,它取决于构造Socket类时使用的构造方法。一般使用数据流连接,数据流连接的优点是所有的数据都能准确、有序地送到接收方,缺点是速度较慢。
Socket类中有四种构造方法。Socket(String,int)构造一个连接指定主机、指定端口Socket的类。Socket(String,int,boolean)构造一个连接指定主机、指定端口的Socket类,boolean类型的参数用来设置是数据流Socket类还是数据报Socket类。Socket(InetAddress,int)构造一个连接指定Internet地址、指定端口的Socket类。Socket(InetAddress,int,boolean)构造一个连接指定Internet地址、指定端口的Socket类,boolean类型的参数用来设置是数据流Socket类还是数据报Socket类。
3.2.2 ServerSocket类
ServerSocket类用在服务器端,它监听和响应客户端的连接请求,并接收客户端发送的数据。ServerSocket类的主要任务是在服务器端耐心地等候其他机器同它连接,一旦客户端程序申请建立一个套接字连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端套接字对象,以便进行直接通信。从两台计算机连接成功时起,服务器端与客户端就得到了一个真正的连接,此时利用Socket类中getlnputStream()以及getOutputStream()方法从每端的套接字产生对应的InputStream和OutputStream对象,并将套接字数据流封装到缓冲区内以便进行两台机器之间的数据通讯。
ServerSocket类的构造方法有两种。
ServerSocket(int)是在指定端口上构造一个
ServerSocket类,ServerSocket(int,int)是在指定端口上构造一个ServerSocket类,并进入监听状态,第二个int类型的参数是监听时间长度。创建一个ServerSocket类时,只需为其赋予一个端口编号,不必把一个IP地址分配给它,因为它已经在自己代表的那台机器上了。但在创建一个Socket类时,却需要同时赋予IP地址以及要连接的端口编号。 3.3 UDP Socket编程
数据以UDP(User Datagram Protocol)进行传输最大的特点就是快,但最大的缺点是数据可能会有丢失,并且丢失后不允许重新传输丢失的数据,这和TCP协议形成了明显的对比。有人就问了,我们已经有了TCP协议,为什么还要UDP协议呢?很简单,为减轻网络压力。我们都知道,在网络上同一时间可能有大量的数据需要传输,这时为了减轻网络压力,我们就需要把不是很重要的数据如游戏可以用UDP协议来传输,这样即使部分数据丢失对于用户来说可能影响不大,这就达到了双赢的效果。给大家举个例子,就拿我们熟悉的CS游戏来说,假设这里有两个用户A和B在玩CS,他们使用的是UDP协议。假如A对B打了一枪,按理说这一枪足以使B毙命,但B在那边却照样B的人却依然活蹦乱跳的,而在A这边B已经躺在地上了。这是为什么呢?就是因为用UDP在进行数据传输过程中丢失了那颗子弹数据,所以对于B来说,那颗子弹根本没有打过来,因为那颗子弹在网络传输过程中丢了。
顺便再讲一下TCP的传输过程,TCP传输过程中不允许数据丢失,如果某部分数据丢失,就会要求将这部分数据重新传输。
数据报是以UDP(User Datagram Protocol用户数据报协议)为通信协议的一种通信方式,它为两台计算机之间提供一种非可靠的无连接投递报文的通信服务,由于这种通信方式不建立连接,所以它不能保证所有的数据都能准确、有序地送到目的地,它允许重传那些由于各种原因半路地丢失的数据。数据报的优点是通讯速度比较快,因此数据报服务一般用于传送非关键性的数据。
Java利用数据报模式在网络上发送和接收数据包需要使用java.net类库中的Datagram Socket类和DatagramPacket类。DatagramSocket类用于收发数据包,而DatagramPacket类则包含了具体的数据信息。
DatagramPacket类是进行数据报通信的基础,它包含了需要传送的数据、数据报的长度、IP地址和端口号等。如果需要创建一个准备传出数据的DatagramPacket类,那么需要知道一个准确的因特网地址和端口号。
DatagramPacket(byte[] buf,int length)构造方法为构造一个用于接收数据报的Datagram Packet类,byte[]类型的参数是接收数据报的缓冲区,int类型的参数是接收数据报中的字节数(数据包长度)。
public DatagramPacket(byte口buf, int length, InetAddress address, int port)构造方法为构造一个用于发送数据的DatagramPacket类,byte[]类型参数是发送数据的缓冲区,int类型参数是发送的字节数,InetAddress类型参数是接收机器的Internet地址,最后一个参数是接收的端口号。