02_天气查询_socket方式模拟_单线程

【远程请求的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传输数据注意要关注下如何解析数据流。

原文地址:https://www.cnblogs.com/HigginCui/p/5832710.html