第9章 Socket网络编程
9.1 网络编程概述
9.1.1 计算机网络、分组报文和协议
1、计算机网络:由一组通过通信信道相互连接的机器组成。
⑴、机器
①、主机(hosts):运行应用程序的计算机。应用程序有网络浏览器(Web browser)、即时通信代理(IM agent)、文件共享程序
②路由器的作用:将信息从一个通信信道传递或转发到另一个通信信道。
⑵、通信信道(communicationchannal):将字节序列从一个主机传输到里一个主机的一种手段
2、分组报文:信息是指由程序创建和解释的字节序列。在网络环境中,这些字符序列称为分组报文(packet),一组报文是有网络用来完成工作的控制信息,有时还包括一些用户数据。
3、网络协议: 为计算机网络中进行数据交换而建立的规则、标准或约定的集合,相当于相互通信的程序间达成的一种约定。它规定了报文的交换方式和他们包含的意义。
⑴、一组协议规定里分组报文的结构以及怎样对报文中所包含的信息进行解析。设计一组协议是为了在一定约束条件下解决某一特定的问题。
⑵、TCP/IP协议:也称协议族(protocol suite),主要由IP协议、TCP协议和UDP协议组成
⑶、TCP/IP参考模型
在TCP/IP协议族中,底层是主机至网络层,它是由基础的通信信道构成,这些信道由网络层使用,而网络层则完成将分组报文传输到他们的目的地址的工作。TCP/IP协议族中属于网络层的唯一协议是IP协议。
在IP协议层之上称为传输层,它提供了俩种可选择的协议:TCP协议和UDP协议。我们现在所学都在该层。
9.1.2 网络三要素
1、IP地址:InetAddress
网络中设备的标识,每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。由于不易记忆,于是采用主机名来标记IP地址,以方便记忆。
⑴、ipconfig:查看本机IP
⑵、ping:测试连接
⑶、回环地址:127.0.0.1,即如果你的电脑没有没有任何ip地址的情况下,默认的ip就是它。它的作用是在装网卡的时候,利用ping127.0.0.1可以用来测试网卡
⑷、IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。已经用尽。
⑸、IPv6:8组,每组4个16进制数。
2、端口号
每个网络程序都必须绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序,端口号范围从0-65535。编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
常用端口:mysql: 3306、oracle: 1521、web: 80、tomcat: 8080、QQ: 4000、feiQ: 2425
3、网络协议
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
9.2 基本套接字
1、IP协议
IP协议三个定义:
(1)IP定义了在TCP/IP互联网上数据传送的基本单元和数据格式。
(2)IP软件完成路由选择功能,选择数据传送的路径。
(3)IP包含了一组不可靠分组传送的规则,指明了分组处理、差错信息发生以及分组的规则。
没有构造方法,直接用静态方法,获取主机主机名和IP地址,如果 IP 地址的长度非法会抛出UnknownHostException。以代码的形式说明其常见方法、
publicclass AboutIP {
publicstaticvoidmain(String[] args) throws IOException {
//获取主机地址及地址名
//InetAddress i =InetAddress.getLocalHost();
//给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
InetAddress i = InetAddress.getByName("192.168.1.3");
//获取 IP地址字符串(以文本表现形式)。
System.out.println("address is "+i.getHostAddress());
//获取此 IP 地址的主机名。
System.out.println("name is "+i.getHostName());
InetAddress[] ia = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : ia) {
System.out.println("address is "+inetAddress.toString());
}
System.out.println("name is "+ia.length);
}
}
2、UDP和TCP
⑴、UDP的特点:
①、将数据及源和目的封装在数据包中,不需要建立连接、
②、每个数据包的大小限制在64K内
③、不可靠,因为无连接.所以不可靠.
④、速度快,因为不需要连接
例如.聊天的时候就是UDP的,还有视频会议,桌面共享等.
⑵、TCP的特点:
①、建立连接,形成传输数据的通道.
②、在连接中进行大数据量传输
③、通过三次握手完成连接,是可靠的协议
④、必须建立连接,但是效率稍低
例如,打电话就是TCP的.
UDP就相当于对讲机,TCP相当于电话,
下载就是TCP的因为不能丢数据.聊天就是UDP
4、Socket
Socket就是为网络服务提供的一种机制。通信的两端都有Socket,网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
⑴、UDP传输
①、定义UDP发送端
需求:通过UDP传输方式,讲一段文字数据发送出去。
思路:ⅰ、建立UDPSocket服务
ⅱ、提供数据,并将数据封装到数据包中
ⅲ、通过Socket服务的发送功能,将数据包发出去
ⅳ、关闭资源
class UdpSend {
publicstaticvoid main(String[]args) throws IOException {
//1、建立UDPSocket服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!=null){
if("886".equals(line))
break;
//2、提供数据,并将数据封装到数据包中
byte[] buf = line.getBytes();
DatagramPacket dp = newDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.3"),10001);
//3、通过Socket服务的发送功能,将数据包发出去
ds.send(dp);
}
//4、关闭资源
ds.close();
}
}
②、定义UDP接收端
要求:定义一个应用程序,用于接收udp协议传输的数据并处理,即定义udp的接收端
思路:ⅰ、定义UDP Socket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识,方便于明确那些数据过来该应用程可以处理。
ⅱ、定义一个数据包,应为要存储接收到的字节数据。因为数据包对象中有更对功能可以提取字节数据中的不同数据信息。
ⅲ、通过socket服务的receive方法将接收到的数据存入已定义好的数据包中
ⅳ、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
ⅴ、关闭资源
class UdpReceive {
publicstaticvoidmain(String[] args) throws IOException {
//创建UDP socket,建立端点
DatagramSocket ds = new DatagramSocket(10001);
while(true){
//定义一个数据包,应为要存储接收到的字节数据
byte[] buf = newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//通过socket服务的receive方法将接收到的数据存入已定义好的数据包中
ds.receive(dp);
//通过数据包方法获取其中的数据,包括IP地址、数据、端口
String ip =dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port =dp.getPort();
System.out.println(ip+"。。。"+data+"..."+port);
//关闭资源
//ds.close();
}
}
}
⑵、TCP传输
①、客户端:通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
原因:tcp是面向连接的,所以在建立socket服务时,就要有服务端口存在,并连接成功,形成通路后,在该通道进行数据的传输
需求:给服务端发送一个文本文件数据
步骤:
1、创建socket服务,并指定要连接的主机和端口
一旦创建,就会有通路,数据,即输入流和输出流
2、获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端
3、获取socket流中德输入流,将服务端反馈的数据获取到,并打印
4、关闭客户端资源
class TcpClient {
publicstaticvoidmain(String[] args) throws IOException, IOException {
//创建客户端socket服务,并指定要连接的主机和端口
Socket s = new Socket("192.168.1.4",11113);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("wo lai l ".getBytes());
InputStream in = s.getInputStream();
byte[] buf = newbyte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
②、服务端
需求:定义端点接收数据并打印在控制台上
1、创建服务端socket服务,ServerSocket。并监听一个端口
2、获取连接过来的客服端对象,通过accept完成。所以这个方法是zus
3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
4、关闭服务端(可选)
class TcpServer {
publicstaticvoidmain(String[] args) throws IOException {
//建立服务端的Socket服务
ServerSocket ss = new ServerSocket(11113);
//通过accept获取连接过来的客服端对象
Socket s = ss.accept();
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip);
//获取客户端发过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = newbyte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();
out.write("ni hao".getBytes());
}
}
9.3 小知识点
1、Socket()空参构造方法
Socket()空参构造方法,该怎么链接呢?他利用connect方法,该方法需要传入一个SocketAddress对象,在该类下有一个子类InetAddressSocket(),他封装的是IP地址和端口,与InetAddress的区别是,后者只有IP地址。
2、backlog
在ServerSocket构造方法中,有一个构造方法ServerSocket(intPort,int backlog),其中backlog参数代表的是队列最大长度,即同时在线人数,一般在50以下
9.4域名解析
域名解析:DNS(domainname resolution)
想要将主机域名映射成IP地址,需要域名解析服务器(DNS)解析过程,比如,一个域名为:www.baidu.com,是想看到这个现HTTP服务,如果要访问网站,就要进行解析,首先在域名注册商那里通过专门的DNS服务器解析到一个WEB服务器的一个固定IP上:211.214.1.***,然后,通过WEB服务器来接收这个域名,把www.baidu.com这个域名映射到这台服务器上。那么,输入www.baidu.com这个域名就可以实现访问网站内容了.即实现了域名解析的全过程。