网络编程

来源:互联网 发布:nodejs 调用php接口 编辑:程序博客网 时间:2024/06/17 20:57
------- android培训、java培训、期待与您交流!---------

一、网络协议

(1)IP协议

IP是一种网络协议,Internet网络依靠TCP/IP协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的互联。TCP/IP模式是一种层次结构,共分为四层,分别为应用层、传输层、互联层和网络层,各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性。

(2)TCP与UDP协议

在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者,应该了解的,即传输控制协议TCP与用户数据报协议UDP。TCP提供两台计算机间可靠的数据传输,能够保证数据确实送达,而且抵达数据的排列顺序与送出时的顺序相同,因此TCP适合可靠性要求比较高的场合.

UDP是无连接通信协议,不保证数据的正确传输,但能够向若干个目标发送数据,接收自若干个发送源的数据,UDP是以独立发送数据包的方式进行的,接受数据的顺序并不相同,因此UDP适合于一些对数据传输可靠性要求不高的场合。

(3)端口和嵌套字

一般而言,一台计算机只有单一的连到网络的“物理连接”(PhysicalConnection),所有的数据都通过此连接对内、对外送达特定的计算机。这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机通过不同的端口来确定连接到服务器的哪项服务上。

网络程序中套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插插头的设备“插座”,用于连接电器与电线,如下图所示。Java将套接字抽象化为类,程序设计者只需创建Socket类对象,即可使用套接字。


二、TCP连接

InetAddress类

java.net包中的InetAddress类是与IP 地址相关的类,利用该类可以获取IP地址、主机地址等信息,常用方法如下:
InetAdress getByName(String host) 获取与Host相对应的InetAddress对象
String getHostAddress() 获取InetAddress对象所含的IP地址
String getHostName() 获取此IP地址的主机名
InetAddress getLocalHost() 返回本地主机的InetAddress对象


ServerSocket类
java.net包中ServerSocket类用于表示服务器套接字,其主要功能是等待来自网络上的“请求”,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50。

ServerSocket类的构造方法都抛出IOException异常,分别有以下几种形式。
ServerSocket():创建非绑定服务器套接字。
ServerSocket(int port):创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。这种情况适用于计算机上有多块网卡和多个IP的情况,我们可以明确规定ServerSocket在哪块网卡或IP地址上等待客户的连接请求。

ServerSocket类的常用方法
Socket accept() 等待客户机的连接,若链接则创建一套接字
boolean isBound() 判断ServerSocket的绑定状态
InetAddress getInetAddress() 返回此服务器套接字的本地地址
boolean isClose() boolean 返回服务器套接字的关闭状态
void close() void 关闭服务器套接字
void bind(SocketAddress endpoint) 将ServerSocket绑定到特定地址(IP地址和端口号)
int getInetAddress() 返回服务器套接字等待的端口号


服务端

try {        server = new ServerSocket(8998); // 实例化Socket对象 socket = server.accept(); // 实例化Socket对象          // 实例化BufferedReader对象       reader = new BufferedReader(new InputStreamReader(socket.getInputStrea()));     while (true) { // 如果套接字是连接状态            if (reader.ready()) {      // 获得客户端信息                String s = reader.readLine();     try {       if (reader != null) {         reader.close(); // 关闭流       }       if (socket != null) {         socket.close(); // 关闭套接字    

客户端

try { // 捕捉异常      socket = new Socket("127.0.0.1", 8998); // 实例化Socket对象writer = new PrintWriter(socket.getOutputStream(), true);//实质链接过程,并把给writer


三、UDP连接

DatagramPacket类
java.net包的DatagramPacket类用来表示数据包。Datagram Packet类的构造函数有:
DatagramPacket(byte[] buf , int length)
DatagramPacket(byte[] buf , int length , InetAddress address , int port)
第一种构造函数创建DatagramPacket对象,指定了数据包的内存空间和大小。第二种构造函数不仅指定了数据包的内存空间和大小,而且指定了数据包的目标地址和端口。在发送数据时,必须指定接收方的Socket地址和端口号,因此使用第二种构造函数可创建发送数据的DatagramPacket对象。

DatagramPacket类
java.net包中的DatagramSocket类用于表示发送和接收数据包的套接字。该类的构造函数有:
DatagramSocket()
DatagramSocket(int port )
DatagramSocket(int port , InetAddress addr)
第一种构造函数创建DatagramSocket对象,构造数据报套接字并将其绑定到本地主机上任何可用的端口。使用第二种构造函数创建DatagramSocket对象,创建数据报套接字并将其绑定到本地主机上的指定端口。第三种构造函数创建DatagramSocket对象,创建数据报套接字,将其绑定到指定的本地地址。第三种构造函数适用于有多块网卡和多个IP的情况。


发送端

try {    // 实例化InetAddress,指定地址       iaddress = InetAddress.getByName("224.255.10.0");       socket = new MulticastSocket(port); // 实例化多点广播套接字       socket.setTimeToLive(1); // 指定发送范围是本地网络       socket.joinGroup(iaddress); // 加入广播组    DatagramPacket packet = null; // 声明DatagramPacket对象         packet = new DatagramPacket(data, data.length, iaddress, port);    // 将数据打包   socket.send(packet); // 发送数据     

接收端

try {       group = InetAddress.getByName("224.255.10.0"); // 指定接收地址       socket = new MulticastSocket(port); // 绑定多点广播套接字       socket.joinGroup(group); // 加入广播组   while (true) {   byte data[] = new byte[1024]; // 创建byte数组       DatagramPacket packet = null; // 创建DatagramPacket对象       packet = new DatagramPacket(data, data.length, group, port);      // 待接收的数据包    try {     socket.receive(packet); // 接收数据包     String message = new String(packet.getData(), 0, packet.getLength()); // 获取数据包中内容     




------- android培训、java培训、期待与您交流!---------


0 0
原创粉丝点击