又是在华清远见培训快乐学习知识的一天!今天学习了网络编程,其中包括网络通信介绍、TCP/IP协议(重点掌握)、UDP/IP协议以及这两个协议的具体对比(掌握)。
文章目录
前言
我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?本文就介绍了其相关的基础内容。
一、网络通信介绍
网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到和通信的目的。通信是人与人之间通过某种媒体进行的信息交流与传递。网络通信即是通过网络将各个孤立的设备进行连接,通过信息交换实现人与人,人与计算机,计算机与计算机之间的通信。网络通信中最重要的就是网络通信协议。
二、TCP网络通信
1、TCP/IP协议(掌握)
1)三次握手
三次握手详细解释:
第一次握手:客户端发起,发送SYN请求报文,序列化:X;服务器收到SYN请求报文。
第二次握手:服务器端发起,发送ACK确认报文,确认号:X+1;发送SYN请求报文,序列号Y,客户端收到SYN/ACK请求确认报文。
第三次握手:客户端发送ACK确认报文,确认号Y+1,服务器端收到ACK确认报文。
2)TCP/IP协议
TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。
TCP可以保证从一端数据传至连接的另一端时,数据能够确实送达。
TCP协议适合可靠性比较高的场合,就像拨打电话。
客户端:
输入流:服务器给客户端发送(对应服务器端的输出流)
输出流:客户端给服务器发送(服务器的输入流)
服务器:
输入流:客户端给服务器端。(就是客户端通过输出流输出的数据)
输出流:服务器给客户端发送(服务器输出流对应客户端的输入流)
2、TCP网络通信实例代码
服务器端过程:
第一步:创建服务端套接字(socket)对象,定端口为6666(随意设置),用来接收客户端发来的socket对象。
第二步:接收客户端发来的socket,当服务器没有接收到socket时,会处于阻塞状态。
第三步:用流(输入流)来接收客户端发来的内容。从套接字中获取字节输入流;准备字节数组,作为进行读取的介质;从字节流中读取内容,读取到数组中,并返回读取的字节数量;将字节数组拼成字符串。
第四步:通过输出流向客户端发送回复。获取字节输出流,进行回复;准备一个回复语句;将回复语句转换为字节数组进行传递。
第五步:关闭所有流(不要忘记哦)。
注意:不要忘记抛出异常!
服务器端代码如下(示例):
package com.hqyj.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerTest { public static void main(String[] args) { ServerSocket ss = null; Socket socket = null; InputStream is = null; OutputStream os = null; try { // 创建服务端套接字对象,定端口为6666,用来接收客户端发来的socket对象 ss = new ServerSocket(6666); // 接收客户端发来的socket,当服务器没有接收到socket时,会处于阻塞 socket = ss.accept(); // 用流来接收客户端发来的内容 // 从套接字中获取字节输入流 is = socket.getInputStream(); // 准备字节数组,作为进行读取的介质 byte[] bytes = new byte[1024]; // 从字节流中读取内容,读取到数组中,并返回读取的字节数量 int length = is.read(bytes); // 将字节数组拼成字符串 String content = new String(bytes, 0, length); System.out.println(content); // 通过输出流向客户端发送回复 //获取字节输出流,进行回复 os = socket.getOutputStream(); //准备一个回复语句 String response = "恭喜你,连接成功,可以下课订饭了"; //将回复语句转换为字节数组进行传递 switch (content) { case "1": response = "1"; break; case "2": break; case "3": break; case "4": break; default: break; } os.write(response.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { is.close(); os.close(); socket.close(); ss.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
客户端代码如下(示例):package com.hqyj.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class ClientTest { public static void main(String[] args) { Socket socket = null; OutputStream os = null; InputStream is = null; try { socket = new Socket("127.0.0.1", 9999); Scanner scan = new Scanner(System.in); while (true) { //输出流 os = socket.getOutputStream(); String request = scan.next(); os.write(request.getBytes()); //输入流 is = socket.getInputStream(); byte bytes[] = new byte[1024]; int length = 0; String str = ""; length = is.read(bytes); str += new String(bytes, 0, length); System.out.println(str); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { is.close(); os.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
三、UDP/IP协议(了解过程)
1、UDP/IP协议实例代码
UDP协议无连接通信协议,不保证可靠数据的传输,但能够同时向若干目标发送数据。
UDP协议适合于一些对数据准确性要求不高的场合,如网络聊天室,在线影片等。
接收端代码如下(示例):
package com.hqyj.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPRecevier { public static void main(String[] args) { // TODO Auto-generated method stub DatagramSocket socket = null; try { socket = new DatagramSocket(8848); byte data[] = new byte[1024]; DatagramPacket dp = new DatagramPacket(data, data.length); socket.receive(dp); System.out.println(dp.getAddress()); System.out.println(new String(data,0,data.length)); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { socket.close(); } } }
发送端代码如下(示例):package com.hqyj.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPSender { public static void main(String[] args) { // TODO Auto-generated method stub DatagramSocket socket = null; while(true) { try { socket = new DatagramSocket(); String str = "UDP发送"; for(int i = 2;i<=255;i++) { String ipAddress = "192.168.31."+i; DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName(ipAddress),8848); socket.send(dp); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { socket.close(); } } } }
四、TCP/IP和UDP/IP对比
1)TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。
2)UDP是一种无连接的协议,每个数据报都是一个独立的地址信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
3)UDP每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
4)UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
5)UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方
6TCP 面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。
7)TCP传输数据无大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。
8)TCPTCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。
9)TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。
10)UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
对比总结(重点):
1)TCP/IP:基于三次握手,面向连接的固线双向通路,安全可靠,收发顺序一致,大小无限制,相对时间慢。准确性高,适用于对数据准确性有要求的场合
2)UDP/IP:无连接,每一个数据报文都有独立的信,每个报文不能超过64K,相对时间快。但是无序不准确,适用于准确要求不高的场合,78总结9提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。