每天学一点之网络编程
创始人
2024-05-30 06:23:50
0

网络编程

一、软件结构

C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷,百度网盘。
B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等。

网络编程,就是在一定的协议下,实现两台计算机的通信的程序。

二、网络通信协议

TCP/IP协议参考模型:内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
在这里插入图片描述

  • 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
  • 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。而IP协议是一种非常重要的协议。IP(internet protocal)又称为互联网协议。IP的责任就是把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
  • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。TCP(Transmission Control Protocol)协议,即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务。
  • 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

三、TCP与UDP协议

UDP:用户数据报协议(User Datagram Protocol)。

  • 非面向连的,不可靠的:UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
  • 大小限制的:数据被限制在64kb以内
  • 数据报(Datagram):网络传输的基本单位

TCP:传输控制协议 (Transmission Control Protocol)。

  • 面向连接的,可靠的:TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。是一种面向连接的、可靠的、基于字节流的传输层的通信协议,可以连续传输大量的数据。
  • TCP协议会采用“三次握手”方式让它们建立一个连接,用于发送和接收数据的虚拟链路。数据传输完毕TCP协议会采用“四次挥手”方式断开连接。

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

  • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

四次挥手:TCP协议中,在发送数据结束后,释放连接时需要经过四次挥手。

  • 第一次挥手:客户端向服务器端提出结束连接,让服务器做最后的准备工作。此时,客户端处于半关闭状态,即表示不再向服务器发送数据了,但是还可以接受数据。
  • 第二次挥手:服务器接收到客户端释放连接的请求后,会将最后的数据发给客户端。并告知上层的应用进程不再接收数据。
  • 第三次挥手:服务器发送完数据后,会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。
  • 第四次挥手:客户端接收到服务器最后的释放连接报文后,要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端,发送完最后的报文后,会等待2MSL,因为有可能服务器没有收到最后的报文,那么服务器迟迟没收到,就会再次给客户端发送释放连接的报文,此时客户端在等待时间范围内接收到,会重新发送最后的报文,并重新计时。如果等待2MSL后,没有收到,那么彻底断开。

多个客户端与服务器之间的多次通信

public class Client2 {public static void main(String[] args) throws Exception {// 1、准备Socket,连接服务器,需要指定服务器的IP地址和端口号Socket socket = new Socket("127.0.0.1", 8888);// 2、获取输出流,用来发送数据给服务器OutputStream out = socket.getOutputStream();PrintStream ps = new PrintStream(out);// 3、获取输入流,用来接收服务器发送给该客户端的数据InputStream input = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(input));Scanner scanner = new Scanner(System.in);while(true){System.out.println("输入发送给服务器的单词或成语:");String message = scanner.nextLine();if(message.equals("stop")){socket.shutdownOutput();break;}// 4、 发送数据ps.println(message);// 接收数据String feedback  = br.readLine();System.out.println("从服务器收到的反馈是:" + feedback);}//5、关闭socket,断开与服务器的连接scanner.close();socket.close();}
}public class Server2 {public static void main(String[] args) throws IOException {// 1、准备一个ServerSocketServerSocket server = new ServerSocket(8888);System.out.println("等待连接...");int count = 0;while(true){// 2、监听一个客户端的连接Socket socket = server.accept();System.out.println("第" + ++count + "个客户端"+socket.getInetAddress().getHostAddress()+"连接成功!!");ClientHandlerThread ct = new ClientHandlerThread(socket);ct.start();}//这里没有关闭server,永远监听}static class ClientHandlerThread extends Thread{private Socket socket;public ClientHandlerThread(Socket socket) {super();this.socket = socket;}public void run(){try{//(1)获取输入流,用来接收该客户端发送给服务器的数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//(2)获取输出流,用来发送数据给该客户端PrintStream ps = new PrintStream(socket.getOutputStream());String str;// (3)接收数据while ((str = br.readLine()) != null) {//(4)反转StringBuilder word = new StringBuilder(str);word.reverse();//(5)返回给客户端ps.println(word);}System.out.println(socket.getInetAddress().getHostAddress()+"正常退出");}catch(Exception  e){System.out.println(socket.getInetAddress().getHostAddress()+"意外退出");}finally{try {//(6)断开连接socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

UDP传输数据

public class Send {public static void main(String[] args)throws Exception {
//		1、建立发送端的DatagramSocketDatagramSocket ds = new DatagramSocket();//要发送的数据ArrayList all = new ArrayList();all.add("好好学习!");all.add("天天向上!");all.add("每天进步一点点!");all.add("早日就业!");//接收方的IP地址InetAddress ip = InetAddress.getByName("127.0.0.1");//接收方的监听端口号int port = 9999;//发送多个数据报for (int i = 0; i < all.size(); i++) {
//			2、建立数据包DatagramPacketbyte[] data = all.get(i).getBytes();DatagramPacket dp = new DatagramPacket(data, data.length, ip, port);
//			3、调用Socket的发送方法ds.send(dp);}//		4、关闭Socketds.close();}
}public class Receive {public static void main(String[] args) throws Exception {
//		1、建立接收端的DatagramSocket,需要指定本端的监听端口号DatagramSocket ds = new DatagramSocket(9999);//一直监听数据while(true){//		2、建立数据包DatagramPacketbyte[] buffer = new byte[1024*64];DatagramPacket dp = new DatagramPacket(buffer , buffer.length);//		3、调用Socket的接收方法ds.receive(dp);//4、拆封数据String str = new String(buffer,0,dp.getLength());System.out.println(str);}}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...