【远程请求的B/S模式(客户端/服务器)】
TCP: 是一种传输层协议,一种面向连接的协议。经过三次握手客户端和服务器端连接一个连接(通道)。提供可靠的数据传输,该协议一般服务质量要求比较高的情况,TCP支持的应用层协议主要有:Talnet、FTP、SMTP、HTTP等。
UDP:是一种传输层协议,是一种数据报协议,速度是很快的,不稳定的。它是面向非连接的协议,它不与对方建立连接,直接就把数据包发送出去。属于面向事务的简单不可靠信息传输服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)。
由于TCP协议具有的可靠性的特点,本功能最终采用TCP通信方式,客户端向服务端发送请求,查询天气信息。
【Socket发送和接受数据请求】
【工程截图】
【服务端WeatherServer.java】
package com.Higgin.socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class WeatherServer { public static void main(String[] args) throws IOException { //创建天气服务 //应用服务端口建议在10000以上 ServerSocket serverSocket=new ServerSocket(12345); System.out.println("启动天气查询服务...."); Socket socket=null; DataInputStream dataInputStream=null; DataOutputStream dataOutputStream=null; try { //接受客户端链接 socket =serverSocket.accept(); //接受客户端的而请求数据 dataInputStream=new DataInputStream(socket.getInputStream()); //客户端发送城市的名称 String cityName=dataInputStream.readUTF(); System.out.println("from client...."+cityName); //向客户端发送数据 dataOutputStream =new DataOutputStream(socket.getOutputStream()); //查询天气信息 String result="晴天"; //向客户端回应 dataOutputStream.writeUTF(result); System.out.println("to client..."+result); } catch (Exception e) { e.printStackTrace(); }finally{ //释放资源 dataInputStream.close(); dataOutputStream.close(); //服务端一般不主动关闭服务,由客户端来关闭 } } }
【客户端WeatherClient.java】
package com.Higgin.socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class WeatherClient { public static void main(String[] args) throws IOException { //创建socket连接 Socket socket=null; DataInputStream dataInputStream=null; DataOutputStream dataOutputStream=null; try{ socket =new Socket("127.0.0.1",12345); //向服务端发送数据 dataOutputStream =new DataOutputStream(socket.getOutputStream()); //城市名称 String cityName="北京"; dataOutputStream.writeUTF(cityName); System.out.println("to Server.."+cityName); //接受服务端的返回数据 dataInputStream=new DataInputStream(socket.getInputStream()); String result=dataInputStream.readUTF(); System.out.println("from server ..."+result); }catch(Exception e){ e.printStackTrace(); }finally{ //释放资源 dataInputStream.close(); dataOutputStream.close(); socket.close(); } } }
【运行结果】
1.先启动服务端:
2.然后启动客户端
3.再回头看服务端(此时已由客户端关闭服务)
【注意点】
使用Socket传输数据注意要关注下如何解析数据流。