指在计算机网络中怎样实现数据传输软件结构C/S结构全称为Client/Server结构是指客户端和服务器结构。常见程序有、红蜘蛛、飞秋等软件。B/S结构全称为Browser/Server结构是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等。网络通信协议网络通信协议通过计算机网络可以使多台计算机实现连接位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中这些连接和通信的规则被称为网络通信协议它对数据的传输格式、传输速率、传输步骤等做了统一规定通信双方必须同时遵守才能完成数据交换。TCP/IP协议传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol)是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议并采用了4层的分层模型每一层都呼叫它的下一层所提供的协议来完成自己的需求。TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层每层分别负责不同的通信功能。 链路层链路层是用于定义物理传输通道通常是对某些网络连接设备的驱动协议例如针对光纤、网线提供的驱动。网络层网络层是整个TCP/IP协议的核心它主要用于将传输的数据进行分组将分组数据发送到目标计算机或者网络。而IP协议是一种非常重要的协议。IPinternet protocal又称为互联网协议。IP的责任就是把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西它还提供对数据大小的重新组装功能以适应不同网络对包大小的要求。传输层主要使网络程序进行通信在进行网络通信时可以采用TCP协议也可以采用UDP协议。TCPTransmission Control Protocol协议即传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP(User Datagram Protocol用户数据报协议)是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务。应用层主要负责应用程序的协议例如HTTP协议、FTP协议等。TCP与UDP协议UDP用户数据报协议(User Datagram Protocol)。面向无连接基于数据报包进行数据传输、传输数据时不会去确定接收端是否存在、接收端接收到数据也不会有反馈 数据包有 大小限制数据被限制在64kb以内超出这个范围就不能发送了。TCP传输控制协议 (Transmission Control Protocol)。面向连接(效率较低、能保证数据完整性、对传输数据没有大小限制、更加安全)三次握手TCP协议中在发送数据的准备阶段客户端与服务器之间的三次交互以保证连接的可靠。第一次握手客户端向服务器端发出连接请求等待服务器确认。第二次握手服务器端向客户端回送一个响应通知客户端收到了连接请求。第三次握手客户端再次向服务器端发送确认信息确认连接。四次挥手TCP协议中在发送数据结束后释放连接时需要经过四次挥手。第一次挥手客户端向服务器端提出结束连接让服务器做最后的准备工作。此时客户端处于半关闭状态即表示不再向服务器发送数据了但是还可以接受数据。第二次挥手服务器接收到客户端释放连接的请求后会将最后的数据发给客户端。并告知上层的应用进程不再接收数据。第三次挥手服务器发送完数据后会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。第四次挥手客户端接收到服务器最后的释放连接报文后要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端发送完最后的报文后会等待2MSL因为有可能服务器没有收到最后的报文那么服务器迟迟没收到就会再次给客户端发送释放连接的报文此时客户端在等待时间范围内接收到会重新发送最后的报文并重新计时。如果等待2MSL后没有收到那么彻底断开。完成三次握手连接建立后客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性TCP协议可以保证传输数据的安全所以应用十分广泛例如下载文件、浏览网页等。网络编程三要素协议协议规定计算机与计算机之间传输数据的格式IP地址IP地址指互联网协议地址Internet Protocol Address俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话那么“IP地址”就相当于“电话号码”。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组十六进制数表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789号称可以为全世界的每一粒沙子编上一个网址这样就解决了网络地址资源数量不够的问题。IP地址分类方式二公网地址( 万维网使用)和 私有地址( 局域网使用)。192.168.开头的就是私有址址范围即为192.168.0.0--192.168.255.255专门为组织机构内部使用常用命令查看本机IP地址在控制台输入ipconfig检查网络是否连通在控制台输入ping 空格 IP地址 ping 220.181.57.216特殊的IP地址本地回环地址(hostAddress)127.0.0.1主机名(hostName)localhost域名因为IP地址数字不便于记忆因此出现了域名域名容易记忆当在连接网络时输入一个主机的域名后域名服务器(DNS)负责将域名转化成IP地址这样才能和主机建立连接。 ------- 域名解析3、端口号网络的通信本质上是两个进程应用程序的通信。每台计算机都有很多的进程那么在网络通信时如何区分这些进程呢如果说IP地址可以唯一标识网络中的设备那么端口号就可以唯一标识设备中的进程应用程序了。端口号用两个字节表示的整数它的取值范围是0~65535。公认端口0~1023。被预先定义的服务通信占用如HTTP80FTP21Telnet23注册端口1024~49151。分配给用户进程或应用程序。如Tomcat8080MySQL3306Oracle1521。动态/ 私有端口49152~65535。如果端口号被另外一个服务或应用所占用会导致当前程序启动失败。利用协议IP地址端口号三元组合就可以标识网络中的进程了那么进程间的通信就可以利用这个标识与其它进程进行交互。2. InetAddress类InetAddress类主要表示IP地址两个子类Inet4Address、Inet6Address。Internet上的主机有两种方式表示地址域名(hostName)www.yaorange.comIP 地址(hostAddress)202.108.35.210lInetAddress 类没有提供公共的构造器而是提供 了 如下几个 静态方法来获取InetAddress 实例public static InetAddress getLocalHost()public static InetAddress getByName(String host)public static InetAddress getByAddress(byte[] addr)InetAddress 提供了如下几个常用的方法public String getHostAddress() 返回 IP 地址字符串以文本表现形式。public String getHostName() 获取此 IP 地址的主机名Test public void testInetAddress() throws UnknownHostException { // 获取本机的IP InetAddress localHost InetAddress.getLocalHost(); System.out.println(localHost); // 通过IP获取 InetAddress byName InetAddress.getByName(www.baidu.com); System.out.println(byName); byte[] bytes {127,0,0,1}; // 通过IP数组获取 InetAddress byAddress InetAddress.getByAddress(bytes); System.out.println(byAddress); // 获取IP地址的字符串 String address byName.getHostAddress(); System.out.println(address); // 获取主机名称 String hostName byName.getHostName(); System.out.println(hostName); }3. Socket通信的两端都要有Socket也可以叫“套接字”是两台机器间通信的端点。网络通信其实就是Socket间的通信。Socket可以分为流套接字stream socket使用TCP提供可依赖的字节流服务ServerSocket此类实现TCP服务器套接字。服务器套接字等待请求通过网络传入。Socket此类实现客户端套接字也可以就叫“套接字”。套接字是两台机器间通信的端点。1、服务器端服务器 程序的工作过程包含以下四个基本的 步骤调用 ServerSocket(int port) 创建一个服务器端套接字并绑定到指定端口上。用于监听客户端的请求。调用 accept() 监听连接请求如果客户端请求连接则接受连接返回通信套接字对象。调用 该Socket 类对象的 getOutputStream() 和 getInputStream () 获取输出流和输入流开始网络数据的发送和接收。关闭Socket 对象客户端访问结束关闭通信套接字。2、客户端客户端Socket 的工作过程包含以下四个基本的步骤 创建 Socket 根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应则建立客户端到服务器的通信线路。若连接失败会出现异常。打开连接到 Socket 的输入/ 出流 使用 getInputStream()方法获得输入流使用getOutputStream()方法获得输出流进行数据传输按照一定的协议对 Socket 进行读/ 写操作通过输入流读取服务器放入线路的信息但不能读取自己放入线路的信息通过输出流将信息写入线路。关闭 Socket 断开客户端到服务器的连接释放线路3.1.3 相关APIServerSocket类的构造方法ServerSocket(int port) 创建绑定到特定端口的服务器套接字。ServerSocket类的常用方法Socket accept()侦听并接受到此套接字的连接。Socket类的常用构造方法public Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。数据报套接字datagram socket使用UDP提供“尽力而为”的数据报服务DatagramSocket此类表示用来发送和接收UDP数据报包的套接字。基于UDP实现数据的传输相关类: DatagramPacket接收:DatagramPacket(byte[] buf, int offset, int length)DatagramPacket(byte[] buf, int length)发送:DatagramPacket(byte[] buf, int length, InetAddress address, int port)DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)DatagramSocketreceive(DatagramPacket p)从此套接字接收数据报包。void send(DatagramPacket p)从此套接字发送数据报包。Test public void clinet() throws IOException { DatagramSocket socket new DatagramSocket(); //String s美美哒; byte[] s美美哒.getBytes(); DatagramPacket packet new DatagramPacket(s,s.length, InetAddress.getLocalHost(),8000); socket.send(packet); socket.close(); } Test public void server() throws IOException { DatagramSocket socket new DatagramSocket(8000); byte[] bytes new byte[1024]; DatagramPacket packet new DatagramPacket(bytes, bytes.length); socket.receive(packet); String s new String(bytes, 0, packet.getLength()); System.out.println(s); socket.close(); }基于TCP实现数据传输客户端发送、服务器接收、且服务器会响应接收完毕Socket : 客户端套接字ServerSocket : 服务器端套接字Test public void client() throws IOException { Socket socket new Socket(InetAddress.getLocalHost(),8000); OutputStream outputStream socket.getOutputStream(); byte[] bytes ha ha ha hello.getBytes(); outputStream.write(bytes); socket.shutdownOutput(); InputStream inputStream socket.getInputStream(); byte[] bys new byte[1024]; int len; while ((len inputStream.read(bys))!-1){ String s1 new String(bys, 0, len); System.out.println(接受来自服务端s1); } socket.shutdownInput(); outputStream.close(); socket.close(); inputStream.close(); } Test public void server() throws IOException { ServerSocket serverSocket new ServerSocket(8000); while (true) { Socket accept serverSocket.accept(); new Thread(()-{ try { InputStream inputStream accept.getInputStream(); byte[] bytes new byte[1024]; int len; while ((len inputStream.read(bytes)) ! -1) { String s new String(bytes, 0, len); System.out.println(s); } accept.shutdownInput(); OutputStream outputStream accept.getOutputStream(); String s 美美的 一天ei; outputStream.write(s.getBytes()); accept.shutdownOutput(); accept.close(); outputStream.close(); inputStream.close(); }catch (Exception e){ e.printStackTrace(); } }).start(); } }