时至今日,计算机网络缩短了人们之间的距离,把"地球村"变成现实,网络应用已经成为计算机领域最广泛的应用。
所谓计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成 一个规模大、功能强的网络系统,从而使众多的计算机可以方便的互相传递信息,共享硬件、软件、数据信息等资源。
IP 端口 url 协议
IP地址和端口号
IP地址用于唯一地标识网络中的一个通信实体,这个同通信实体即可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口。而在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。
IPV4 :32位
IPV6:128位
特殊的IP:
非注册IP,供组织内部使用:192.168.0.0-192.168.255.255
127.0.0.1:本地IP,指本机
localhost:本地域名,也指本机
DNS 服务器 :IP与域名解析
Java中如何表示IP:InetAddress(类)
public class InetAddressTest{
public static void main(String() args){
InterAddress ip=InterAddress.getByName("www.baidu.com");
System.out.println("baidu是否可达:"+ip.isReachable(2000));
System.out.println(ip.getHostAddress());
System.out.println(ip.getLocalHost());
}
}
基于TCP协议的网络编程
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来嗲表两端的通信端口,并通过Socket产生IO流来进行网络通信。
使用ServerSocket创建TCP服务器端
//创建一个ServerSocket,用于监听客户端Socket的链接请求
ServerSocket ss = new ServerSocket;
while(true){
Socket s = ss.accept();
}
使用Socket进行通信
客户端通常可以使用Socket的构造器来链接到指定服务器,Socket通常可以使用如下两个构造器。
Socket(InetAddress/String remoteAddress,int port):创建连接到指定远程主机,远程端口的Socket,该构造器没有指定本地地址,本地端口,默认使用本机的默认IP地址,默认使用系统动态分配的端口。
Socket(InetAddress/String remoteAddress,int port,InetAddres loaclAddr ,int localPort):创建连接到指定远程主机,远程端口的Socket,并指定本地IP地址和本地端口,适用于本地主机有多个IP地址的情形。
上面两个构造器中指定远程主机时既可使用InetAddress来指定,也可直接使用String对象来指定,但程序通常使用String对象来指定远程IP地址。当本地主机只有一个IP地址时,使用第一个方法更简单。如下代码:
Socket s = new Socket("127.0.0.1",9875);//创建本地主机,端口9875
当程晓执行时上面代码中的粗体字代码时,该代码将会连接到指定服务器,让服务器端的ServerSocket的accept()方法向下执行,于是服务端和客户端就产生一对互相连接的Socket。
当客服端,服务端产生了对象的Socket之后,程序无需再区分服务器端和客户端,而是通过各自的Socket提供了如下两个方法来获取输入流和输出流。
InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。
OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流从Socket中输出数据。
public class Client {//客户端
public static void main(String[] args){
Socket client = new Socket("127.0.0.1",9876);
String str = "这是一个客户端";
DataOutputStream do = new DataOutputStream(client.getOutputStream());
do.writeUTF(str);
do.flush();
do.close();
client.close();
}
}
服务器端
public class Server {//服务器端
public static void main(String[] args){
ServerSocket server = new ServerSocket(9876);
Socket client = server.accept();//监听
System.out.println("-------一个客户端接入---------------");//如果有客户端连入输出
DataInputStream do = new DataInputStream(client.getInputStream());
do.readUTF(str);
do.close();
client.close();
server.close();//单次登录后关闭服务端
}
}
上面两个代码简单的模拟了一次客户端和服务端响应。