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

时间:2023-03-09 18:54:26
02_天气查询_socket方式模拟_单线程

【远程请求的B/S模式(客户端/服务器)】

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

  TCP: 是一种传输层协议,一种面向连接的协议。经过三次握手客户端和服务器端连接一个连接(通道)。提供可靠的数据传输,该协议一般服务质量要求比较高的情况,TCP支持的应用层协议主要有:Talnet、FTP、SMTP、HTTP等。

  UDP:是一种传输层协议,是一种数据报协议,速度是很快的,不稳定的。它是面向非连接的协议,它不与对方建立连接,直接就把数据包发送出去。属于面向事务的简单不可靠信息传输服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)。

  由于TCP协议具有的可靠性的特点,本功能最终采用TCP通信方式,客户端向服务端发送请求,查询天气信息。

【Socket发送和接受数据请求】

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

【工程截图】

02_天气查询_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.先启动服务端:

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

2.然后启动客户端

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

3.再回头看服务端(此时已由客户端关闭服务)

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

【注意点】

使用Socket传输数据注意要关注下如何解析数据流。