当前位置: 首页 > 后端技术 > Python

Web开发中的通信方式有哪些?_0

时间:2023-03-25 21:07:27 Python

Web开发中的通信方式简单通信不同请求复杂请求案例实践1简单通信回顾Socket编程给我们最大的感受,就是可以在多台计算机之间进行数据传输,这是网络编程的开始和基础,通过客户端对服务器端通信的请求来直观地理解Web编程。Server/**Server,接收客户端请求并给出简单响应@authorCushier**/publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{//创建服务器,指定端口ServerSocket(intport)ServerSocketsocket=新服务器套接字(8888);//接收客户端连接Socketclient=socket.accept();System.out.println("**");//获取数据的输入流InputStreamis=client.获取输入流();//使用缓冲字符输入流BufferedReaderbr=newBufferedReader(newInputStreamReader(is));字符串消息="";while((msg=br.readLine())!=null){System.out.打印(消息);}br.close();}}Client/**Client:向服务器发送请求并发送简单消息@authorCushier**/publicclassClient{publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{//创建客户端,必须指定服务器+端口Socketclient=newSocket("localhost",8888);//发送消息请求资源//获取输出流OutputStreamos=client.getOutputStream();//使用缓冲字符输出流BufferedWriterbr=newBufferedWriter(newOutputStreamWriter(os));//写出消息并发送内容Stringmsg="Hello,IamClient,Ineedsomeresources";br.write(消息);br.close();}}服务端控制台:从上面的例子来看,通信条件总结如下:需要server:等待请求,需要暴露ip和端口,需要client:主动发起请求,知道ip和端口通信规则服务器的(协议):TCP/IP协议ip用于定位电脑;端口号(定位程序)用于标识进程的逻辑地址,不同进程的标识;有效端口:0~65535,其中0~1024为系统使用或保留,开发时建议使用1024以上的端口2不同的请求Client/**Client:向服务器发送请求,发送不同的请求@authorCushier**/publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{//通过系统默认类型的SocketImpl创建一个未连接的socketSocket=newSocket();//该类实现了IP套接字地址(IP地址+端口号)。它也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名SocketAddressaddress=newInetSocketAddress("localhost",8898);//将此套接字连接到服务器,指定超时值。或者不指定超时socket.connect(address,1000);OutputStreamos=socket.getOutputStream();os.write("时间".getBytes());os.flush();套接字关闭();}}Server/**serverpublicclassServerSockettextendsObject:这个类实现了服务器套接字。服务器套接字等待通过网络传入的请求。它根据请求执行一些操作,然后可能将结果返回给请求者。@authorCushier**/publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{//创建绑定到特定端口的服务器套接字。ServerSocketserver=newServerSocket(8898);//Socketaccept()侦听并接受到此套接字的连接。套接字客户端=server.accept();System.out.println("Connectionreceived");InputStreamis=client.getInputStream();BufferedInputStreambis=newBufferedInputStream(is);byte[]req=newbyte[1024];//接收客户端请求intlen=bis.read(req);StringreqStr=newString(req,0,len);System.out.println(reqStr);if(reqStr.equals("money")){System.out.println("这是钱");}elseif(reqStr.equals("time")){System.out.println("你有那么多时间");}客户端关闭();服务器.close();}}Serverconsole:3complexrequestsClient/**client@authorCushier**/publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{//通过系统默认类型的SocketImpl创建未连接的socketSocketsocket=新套接字();//该类实现IP套接字地址(IP地址+端口号)。它也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名SocketAddressaddress=newInetSocketAddress("localhost",8898);//将此套接字连接到服务器,指定超时值。或者不指定超时socket.connect(address,1000);OutputStreamos=socket.getOutputStream();os.write("钱".getBytes());os.flush();//接收响应并显示结果InputStreamis=socket.getInputStream();字节[]结果=新字节[1024];intlen=is.read(result);StringresultStr=newString(result,0,len);System.out.println(resultStr);套接字关闭();}}Server/**Server@authorCushier**/publicclassServer2{publicstaticvoidmain(String[]args)throwsIOException{//创建绑定到特定端口拾取的服务器套接字。ServerSocketserver=newServerSocket(8898);//Socketaccept()侦听并接受到此套接字的连接。套接字客户端=server.accept();System.out.println("收到连接");InputStream=client.getInputStream();BufferedInputStreambis=newBufferedInputStream(is);byte[]req=newbyte[1024];//接收客户端请求intlen=bis.read(req);StringreqStr=newString(req,0,len);System.out.println(reqStr);//将接收到的请求封装成一个对象,发送给请求的类MyRequestrequest=newMyRequest();MyResponseresponse=newMyResponse();OutputStreamos=client.getOutputStream();if(reqStr.equals("money")){//根据请求的信息,构造处理类MyServlets1=newServletMoney();s1.service(请求,响应);//通过客户端的响应,将结果返回给客户端os.write("here'sthemoney".getBytes());os.flush();}elseif(reqStr.equals("time")){//根据请求信息,构造处理类MyServlets2=newServletTime();s2.service(请求,响应);//传递客户端的响应,将响应结果返回给客户端os.write("youhavesomuchtime".getBytes());os.flush();}client.close();服务器.close();}}/*我是一个有要求的人。你请求的资源必须是符合我要求的格式的类。功能:防止混淆,方便调用。这是我的标准*/interfaceMyServlet{voidservice(MyRequestreq,MyResponseresp);}classServletMoneyimplementsMyServlet{@Overridepublicvoidservice(MyRequestreq,MyResponseresp){//尽我们所能}}classServletTimeimplementsMyServlet{@Overridepublicvoidservice(MyRequestreq,MyResponseresp){//做尽可能最好的处理}}/*请求信息封装在这个对象中*/classMyRequest{}classMyResponse{}Serverconsole:Clientconsole:随着客户端的要求越来越多复杂,需要的功能越来越多。我们的服务器端需要处理越来越多的请求。需要区分不同的请求,也需要根据不同的请求进行请求数据提取、资源分配和计算。逻辑处理,最后需要响应客户端,这使得服务端代码越来越复杂,实现难度也越来越大。按照以往的经验,双方只需要遵循一定的规则,就可以进行清楚的沟通。一些数据的含义,于是出现了网络上层的应用协议(后文提到的HTTP协议),它规定了服务器与客户端之间通信的规则。客户端请求服务端,服务端按照固定的规则响应客户端,这样接收请求和响应数据的操作就可以固定下来,交给具体的一段代码去执行,从而减少了端上的代码量服务器,所以它出现下一个服务器。扩展服务器的出现当客户端请求的资源越来越丰富,需求越来越复杂时,程序的核心应该放在解决业务和计算响应数据上,所以就有了统一接收的服务器客户端数据,处理并分发到不同的资源,每个资源分别处理,最终结果发送给服务端响应。从上面的描述我们可以发现,服务端只负责接收请求,分发请求,最后为获取到的数据固定对应的帧。至于如何计算数据,还得根据具体的业务需求写(填)代码。无需业务需求即可准备服务器。市场上的服务器很多,比较常用的有:Tomcat、JBOOS、IBM的WebSphere、BEA的WebLogic、Apache。