网络编程是设计与其他计算机进行通信的程序,Java已经将网络编程所需要的东西封装成不同的类,我们对这些类进行调用即可进行网络编程
网络协议
网络协议规定了计算机之间的连接特征、寻址规则、数据发送冲突的解决方式等内容。
IP协议: Internet网络采用的是TCP/IP协议(TCP/IP协议不仅仅指的是TCP 和IP两个协议, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议)。
每台主机都用网络为其分配的Internet地址代表自己,这个地址就是IP地址,目前IP地址主要为IPv4和IPv6。
IPv4:IPv4为4个字节,地址长度为32位,以十进制表示,并且每个数之间用圆点隔开来表示IP地址
(如:192.168.1.75)
IPv6:IPv6为16个字节,地址长度为128位,以十六进制表示,并且每个数之间用冒号隔开来表示IP地址
(如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789)
TCP协议: TCP协议是一种以固接连线为基础的协议,它提供两台计算机可靠的数据传送。(TCP协议适合可靠性要求比较高的场合)
UDP协议: UDP协议是无连接通信协议,不保证数据的可靠运输,但能够向若干个目标发送数据,或接受若干源的数据。(UDP协议适合一些对数据准确性要求不高但对传输速度和时效性要求非常高的网站)
端口与套接字
端口(port)是一个假想的连接装置,用来确定连接某项服务。(端口被规定为0—65535之间的整数,,通常0—1023之间的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另外一个应用或系统服务所用端口冲突)
套接字: 网络程序中的套接字(Socket)用于将应用程序与端口连接起来。Java将套接字抽象化为类,只需创建Socket类对象,即可使用套接字。
TCP程序设计
TCP(Transmission Control Protocol-传输控制协议)网络程序设计是指利用Socket类编写通信程序,利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序。(TCP可比方为电话通讯)
InetAddress类:java.net包中的InetAddress类是于IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
import java.net.InetAddress;//导入java.net包
import java.net.UnknownHostException;
public class TestAddress {
public static void main(String[] args) throws UnknownHostException {
InetAddress IP=InetAddress.getLocalHost();;//实例化InetAddress对象
System.out.println(IP.getHostName());//输出本机名
System.out.println(IP.getAddress());//输出本机IP地址
}
}
ServerSocket类:java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网络上的“请求”,它可通过指定的端口来等待连接的套接字。
例:TCP服务端程序
import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(9999);
Socket s=ss.accept();
InputStream is=s.getInputStream();
byte[] bys = new byte[1024];
int len=is.read(bys);
String data=new String(bys,0,len);
System.out.println("数据是:"+data);
s.close();
ss.close();
}
}
例:TCP客户端程序
import java.io.IOException;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class MyClient {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
Socket s=new Socket("127.0.0.1",9999);
String str=in.nextLine();
OutputStream os = s.getOutputStream();
os.write(str.getBytes());
os.close();
}
}
当指定的端口号已被占用,此时可以在命令提示符界面输入命令"netstat -an"或"netstat -ano"来查看该程序所使用的端口
UDP程序设计
UDP(User Datagram Protocol-用户数据报协议)是网络信息传输的另一种形式。基于UDP的信息传递更快,但不提供可靠的保证。(UDP可比方为信件通讯)
UDP通信的基本模式:
(1)将数据打包(即数据包),然后将数据包发往目的地。
(2)接受别人发来的数据包,然后查看数据包。
UDP程序设计主要通过DatagramPacket类和DatagramSocket类来实现
DatagramPacket类: java.net包的DatagramPacket类用来表示数据包。
DatagramSocket类: java.net包的DatagramSocket类用于表示发送和接收数据包的套接字。(在接收程序时必须指定一个端口号,发送程序时不指定端口号)
UDP网络程序:
例:发送数据程序
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class MyUDP1 {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
Scanner in = new Scanner(System.in);
String str=in.nextLine();
byte[] bys=str.getBytes();
DatagramPacket dp=new DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),8888);
ds.send(dp);
ds.close();
}
}
例:接受数据程序
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class MyUDP2 {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(8888);
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);
ds.receive(dp);
byte[] data=dp.getData();
int len=dp.getLength();
String str=new String(data,0,len);
System.out.println("数据是:"+str);
ds.close();
}
}
发出广播和接收广播的主机地址必须位于同一个组内,地址范围为224.0.0.0~224.255.255.255,该地址并不代表某个特定主机的位置。