Java二十五课时

本文介绍了网络编程的基础知识,包括C/S和B/S结构、网络通信协议以及TCP/IP协议。详细讲解了TCP/IP协议的四层模型和常见协议,如TCP和UDP的特点。此外,还阐述了网络编程的三要素:IP地址和端口号,并讨论了IP地址的分类。最后,通过Java展示了TCP通信程序的实现,包括Socket和ServerSocket类的使用。
摘要由CSDN通过智能技术生成

1 网络编程入门

1.1软件结构

C/S结构:全程为Client/Server结构,也就是客户端和服务器的组合组合结构。如QQ,微信等软件都是这种结构
B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构,比如我们常用的谷歌浏览器、火狐等都是如此。

两种结构各有特点,以为为两种结构的总结:

两种各有各的优势,但是无论那种结构,都离不开网络的支持。网络编程,就是一定的协议之下,使用程序让使用互联网的两个(或多个)计算机之间进行数据传输。
1.2 通信协议

网络通信协议:通过计算机网络可以使多台计算机实现连接,而位于统一网络中的计算机在进行连接和通信时需要遵守一定的规则。这就好像飞机航空一样,必须要遵守严格的规定,否则在没有合理的安排下,容易出现事故。在计算机网络中,这些连接和通信的规范也就被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信的双方都需要遵守这些规则才能够进行数据交换。
TCP/IP协议:英文全称为Transmission Control Protocol / Internet Protocol,也就是传输控制协议或称因特网互联网协议,它是Internet最基本、最广泛的协议。**它定义了计算机如何进入因特网,以及数据如和在它们之间传输的标准。**它的内部包含了一系列用于处理数据通信的协议,并采用了四层分层模型:网络接口层(又称链路层)、网络层(又称互联层)、传输层和应用层,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

每一层对应的协议有:
1.网络接口层协议:Ethernet 802.3、Token Ring 802.5、X.25、Frame relay等。
2.网络层协议:IP(Internet Protocol,英特网协议)、ICMP(Internet Control Message Protocol,控制报文协议)、ARP(Address Resolution Protocol,地址转换协议)、RARP(Reverse ARP,反向地址转换协议)。
3.传输层协议: TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram protocol,用户数据报协议)。
4.应用层协议:FTP(File Transfer Protocol,文件传输协议)、TELNET(用户远程登录服务协议)、DNS(Domain Name Service,是域名解析服务)、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、NFS(Network File System,网络文件系统)、HTTP(Hypertext Transfer Protocol,超文本传输协议)。
1.3 TCP/IP协议
UDP:英文全称为User Datagram Protocol,翻译即为用户数据报协议,数据报也就是Datagram是网络传输的基本单位。UDP是无连接通信协议,也就是在数据传输时,数据的发送端和接收端不用建立逻辑连接。简单来说就是发送端不管接收端是否存在也会发送,同样接收端在收到数据时,也不会对发送端产生任何的反馈。是不是很像你和对象闹变扭的样子呢?

此协议的特点:
1.消耗资源小,通信效益高,所以通常用来普通数据的传输,因为这些数据偶尔丢了一两个数据包也不会产生太大的影响。我们QQ的文字聊天就是使用了此协议。
2.因为UDP无连接性不能保证数据的完整性,因此重要数据不建议使用UDP协议。
3.数据被限制在64KB以内,超出这个范围就不能发送了。这也不难理解,为什么QQ中如果文字过多就无法发送了。
TCP:传输控制协议,英文全称Transmission Control Protocol。与UDP的面向无连接正好相反,TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端之间必须要建立逻辑连接,然后才能传输数据,它提供了两台计算机之间可靠无差错的数据传输。
1.4 网络编程三要素

利用协议+IP地址+端口号三元组合,就可以标识网络中的计算机,同时能够标识计算机中的进程,那么进程间的通信就可以利用这个表示与其他进程进行交互。

1.4.2 IP地址

IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给网络中的计算机设备做唯一的编号。假如我们把每台电脑比作人的话,那么“IP”地址就相当于“身份证号”。
1.4.2.1 IP地址的分类

IPv4:是一个32位的二进制数,通常被分为4个字节,表示成a,b,c,d的形式的话,例如 192.168.65.100。其中a,b,c,d都是0~255之间的十进制整数,那么最多可以表示42亿个。
IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP地址的分配变得紧张起来。为了扩大地址的空间,因此通过IPv6重新定义了地址空间,采用128位的地址长度,每16个字节一组,分成8组16进制数,号称可以成为世界上的每一粒沙子编上一个地址,这样就解决了网络地址资源数量不够的问题。
1.4.2.2 常用命令

查看本机的IP地址,在控制台输入:
ipconfig
检查网络是否两桶,在控制台输入:
ping 空格 IP地址
ping 198,168.1.0.1 (例子)
特殊的IP地址
本机的IP地址:127.0.0.1、localhost
1.4.3 端口号

网络的通信,本质上两个进程(应用程序)的通信,每台计算机都有很多的线程,那么在网络通信时,如何区分这些线程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)。

端口号:用两个字节字节表示的整数,它的取值范围是0~65535。 它是一个逻辑端口,我们无法直接看到,但是可以通过一些软件查看端口号。但我们讲网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号或者网络软件在打开的时候向系统索要指定的端口号。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
一些常用的端口号:
80端口 网络端口 如www.baidu.com:80 (正确) www.baidu.com:70 (错误)
数据库 Mysql:3306 Oracle:1521
Tomcat服务器:8080
2 TCP通信程序

2.1 概述

TCP通信在通过三次握手之后能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)和服务端(Server)。

两端通信时的步骤:
1.服务端程序,需要事先启动,等待客户端的连接。
2.客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
2.2 Java中的实现

在Java中给我们呢提供了一个包,java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。在这个包下提供了两个类用于实现TCP通信程序。

客户端:Java.net.Socket类。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
服务端:java.net.ServerSocket类。创建ServerSocket对象,相当于开启一个服务并等待客户端的连接。

2.2.1 Socket类

此类实现客户端套接字,套接字是两台机器通信的端点。套接字是包含了IP地址和端口号的网络单位。在我们用Java实现客户端和服务器进行交互的时候,必须使用Socket中提供的网络流,不能使用自己创建的流对象。当我们创建客户端对象Socket的时候,客户机就自动和服务器进行了请求,并完成三次握手建立通路,注意如果服务器没有启动,那么就会抛出异常。

构造方法:

Socket(String host,int port):创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。
回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。
常用成员方法

OuputStream getOutputStream():返回此套接字的输出流
InputStream getInputStream():返回此套接字的输入流
void close():关闭此套接字
public void shutdownOutput() : 禁用此套接字的输出流。任何先前写出的数据将被发送,随后终止输出流。
2.2.2 ServerSocket类

此类实现服务器套接字,该对象等待通过网络的请求。

构造方法

SeverSocket(int port):创建绑定到特定端口的服务器套接字。
成员方法

Socket accept():侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

public class ServerTCP {
    public static void main(String[] args) throws IOException {
    System.out.println("服务端启动 , 等待连接 .... ");
    // 1.创建 ServerSocket对象,绑定端口,开始等待连接
    ServerSocket ss = new ServerSocket(6666);
    // 2.接收连接 accept 方法, 返回 socket 对象.
    Socket server = ss.accept();
    // 3.通过socket 获取输入流
    InputStream is = server.getInputStream();
    // 4.一次性读取数据
  	// 4.1 创建字节数组
    byte[] b = new byte[1024];
  	// 4.2 据读取到字节数组中.
    int len = is.read(b);
    // 4.3 解析数组,打印字符串信息
    String msg = new String(b, 0, len);
    System.out.println(msg);
  	// 5. 通过 socket 获取输出流
  	 OutputStream out = server.getOutputStream();
  	// 6. 回写数据
  	 out.write("我很好,谢谢你".getBytes());
  	// 7.关闭资源.
  	out.close();
    is.close();
    server.close();
    }
}

public class ClientTCP {  
	public static void main(String[] args) throws Exception {
	System.out.println("客户端 发送数据");
	// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
	Socket client = new Socket("localhost", 6666);
	// 2.通过Scoket,获取输出流对象 
	OutputStream os = client.getOutputStream();
	// 3.写出数据.
	os.write("你好么? tcp ,我来了".getBytes());
  	// 4. 通过Scoket,获取 输入流对象
  	InputStream in = client.getInputStream();
  	// 5. 读取数据数据
  	byte[] b = new byte[100];
  	int len = in.read(b);
  	System.out.println(new String(b, 0, len));
	// 6. 关闭资源 .
  	in.close();
	os.close();
	client.close();
	}
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值