版权声明:分享知识是一种快乐,愿你我都能共同成长! https://blog.csdn.net/qidasheng2012/article/details/78177234
服务端:
线程类:
package cn.itcast.webservice.socket.server.thread;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
/**
* Description: 天气查询runnable类
*/
public class WeatherRunnable implements Runnable {
private Socket socket;
public WeatherRunnable(Socket socket){
this.socket=socket;
}
@Override
public void run() {
// 创建输入流接收数据
DataInputStream inputStream = null;
// 创建输出流响应数据
DataOutputStream outputStream = null;
try {
outputStream = new DataOutputStream(socket.getOutputStream());
inputStream = new DataInputStream(socket.getInputStream());
// 接收客户端的请求数据
String cityName = inputStream.readUTF();
System.out.println("from client..." + cityName);
// 休眠2秒表示服务端的处理过程
Thread.sleep(2000);
// 使用静态代码表示查询的结果
String result = "晴";
// 服务端向客户端响应结果
outputStream.writeUTF(result);
System.out.println("to client..." + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 注意一般情况 下服务端不能主动关闭客户端的socket连接
}
}
}
多线程类:
package cn.itcast.webservice.socket.server.thread;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Description:天气查询服务端
*/
public class WeatherServer {
public static void main(String[] args) throws IOException {
// 创建服务,监听 的端口建议1万以上
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("服务端已启动....");
while (true) {
// 监听 客户端的连接,accept方法一个阻塞方法
Socket socket = serverSocket.accept();
//接收到客户端请求要开启一个线程来处理
new Thread(new WeatherRunnable(socket)).start();
//在企业开发中建议使用线程池对所有线程进行统一管理,线程不用每次都创建一个新的
//使用ThreadPoolExecutor实现线程池
}
}
}
客户端:
package cn.itcast.webservice.socket.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Description:天气查询socket客户端
*/
public class WeatherClient {
public static void main(String[] args) throws UnknownHostException,
IOException {
while (true) {
// 向服务端创建socket连接
Socket socket = new Socket("127.0.0.1", 12345);
// 创建输入流接收数据
DataInputStream inputStream = null;
// 创建输出流发送数据
DataOutputStream outputStream = null;
try {
// 输出流
outputStream = new DataOutputStream(socket.getOutputStream());
// 输入流
inputStream = new DataInputStream(socket.getInputStream());
// 发送城市名称
String cityName = "北京";
outputStream.writeUTF(cityName);
System.out.println("to server ..." + cityName);
// 接收服务端响应
String result = inputStream.readUTF();
System.out.println("from server..." + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
// 由客户端来关闭socket连接
if (socket != null) {
socket.close();
}
}
}
}
}