Java网络编程
一、网络基础的概念
- 计算机网络概念:
把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而让众多的计算机可以方便地互相传递信息、共享硬件、软件和数据信息等。 - 计算机网络的主要功能:
- 资源共享
- 信息传输与集中处理
- 均衡负荷与分布处理
- 综合信息服务(www/综合业务数字网络ISDN)
二、网络通信接口
- 网络通信协议的概念:
计算机网络中实现通信必须有一些约定俗称的东西,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。 - 网络通信接口概念:
为了是两个结点之间能进行对话,必须在他们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
- 硬件装置:实现结点之间的信息传送
- 软件装置:规定双方进行通信的约定协议 - 通信协议的分层思想
- 分层的原因
由于结点之间联系很复杂,在指定协议时把复杂成分分解成一些简单的成分,再将他们复合起来。最常用的复合方式是层次方法,即同层间可以通信、上一层可以调用下一层,而与下一层不发生关系。各层互不影响,有利于系统的开发和扩展。 - 通信协议的分层规定
把用户程序作为最高层,把物理通信线路作为最底层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。协议分层示意如下图所示:
- 分层的原因
- 分层参考模型:
网络通信协议
三、IP协议
IP协议是网际层的主要协议,支持网间互联的数据报通信,它提供的主要功能有:
- 无连接数据报传送
- 数据报路由选择和差错控制
- 为每台计算机提供唯一的IP地址
四、TCP协议和UDP协议
- TCP是专门设计用于在因特网上提供可靠的端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流(如银行转账系统)。
- UDP是向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,是一种不可靠的连接(如语音、视频、游戏)。
Socket
五、介绍Socket
- 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端成为一个Socket。
- Socket通常用来实现client-server连接
- java.net包中定义两个类Socket和ServerSocket分别用来实现双向连接的client和server端
- 建立连接时所需的寻址信息为远程计算机的IP地址和端口号。端口号具有唯一性,如果有一个应用占用的话,其他应用程序就不能占用!自己编写应用程序如果占用端口号的话,最好要用1024端口以上的,因为1024以下的端口号,可能会被系统随时征用!比如http使用80端口,ftp使用21端口,SMTP使用25端口。
- 端口分类:TCP端口和UDP端口,这两种端口每一个都有65536个端口。
- TCP Socket通信模型:
上面的这个是模型师相当固定,在Server端首先需要new一个ServerSocket来监听某个端口,然后不停地accept,通常用while(true)实现,来等待客户端读的连接,连接成功后,把对方的连接封装为一个socket对象,通过这个对象的输入流/输出流,读或者写数据,最后,用close方法关闭。而对于client这边,首先new一个socket对象,通过构造方法指定IP地址和端口号,连接上以后,通过socket的输入流/输出流来读取数据,最后调用close方法关闭即可。
六、TCP 编程示例如下:
package net;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
while (true) {
//始终等待客户端的连接
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
System.out.println(dataInputStream.readUTF());
inputStream.close();
socket.close();
}
}
}
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
//通过传入host和port,确定连接服务器地址和端口号
Socket socket = new Socket("127.0.0.1", 6666);
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("hello server,I'm client");
dataOutputStream.flush();
dataOutputStream.close();
socket.close();
}
}
可以看到上面有两个小程序,分为server端和client端,首先运行server端程序,输出结果如下:
然后运行client端,运行结果如下:
再看server端的输出结果如下:
程序运行结果分析:首先开启服务端程序等待客户端连接,然后开启客户端程序连接服务器端,并且通过输出流发给服务器端数据,服务端收到客户端的消息后进行打印输出。
说明: IP地址127.0.0.1代表本机地址。
七、UDP编程
- 特点:
- 不可靠的
- 效率高
- 数据报
- 非连接
- 用途:
- 音频
- 视频
- …
- …
UDP编程示例如下:
package net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//服务端程序
public class UDPServer {
public static void main(String[] args) throws SocketException {
//声明一个字节数组用来装填接收过来的数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
DatagramSocket datagramSocket = new DatagramSocket(5555);
while (true) {
try {
datagramSocket.receive(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
//把包裹的内容打印出来
System.out.println(new String(bytes,0,datagramPacket.getLength()));
}
}
}
package net;
import java.io.IOException;
import java.net.*;
//客户端程序
public class UDPClient {
public static void main(String[] args) throws IOException {
byte[] bytes = "hello udpserver".getBytes();
//指定数据报要发送到的目标IP地址和端口号
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,
new InetSocketAddress("127.0.0.1",5555));
//使用9999端口发送
DatagramSocket datagramSocket = new DatagramSocket(9999);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
和TCP类似,首先启动服务端,然后启动客户端,最后查看服务端的运行结果,具体运行结果如下图所示:
总结:
- 网络协议分层思想
- IP的概念
- TCP/UDP的概念
- TCP/UDP程序的写法
- 知识点的融合贯通加流的运用