利用Socket实现登录小demo

客户端代码

package com.lsc.test01;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class TestClient {
    public static void main(String[] args) throws IOException {
       int count = 0;
        Scanner sc = new Scanner(System.in);
        login(sc, count);
    }

    private static void login(Scanner sc, int count) throws IOException {
        Socket s = null;
        ObjectOutputStream oos = null;
        try {
            System.out.println("请输入用户名!");
            String name = sc.next();
            System.out.println("请输入用户名!");
            String pwd = sc.next();
            User user = new User(name, pwd);
            s = new Socket("localhost",8888);
            //DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            //将键盘录入的信息通过ObjectOutputStream发送到socket服务端
            oos = new ObjectOutputStream(s.getOutputStream());
            oos.writeObject(user);
            //从服务端接受到返回的信息
            DataInputStream dis = new DataInputStream(s.getInputStream());
            String response = dis.readUTF();
            System.out.println(response);
            count++;
            if(count < 3){
                if(response != null && response.startsWith("对不起")){
                    login(sc, count);
                }
            }else{
                System.out.println("对不起,登录次数超过3次!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            oos.close();
            s.close();
        }
    }
}

服务端代码

package com.lsc.test01;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class TestServer {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        int count = 0;
        try {
            //socket服务端
            ServerSocket ss = new ServerSocket(8888);
            Socket socket = null;
            while (true) {
                socket = ss.accept();
                //通过构造方法将socket信息传入一个新的线程中执行
                new SocketThread(socket).start();
                count++;
                System.out.println("当前尝试登录的第"+count+"个用户,该用户的IP为:" + socket.getInetAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

线程类代码

package com.lsc.test01;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class SocketThread extends Thread {
    ObjectInputStream ois = null;
    DataOutputStream dos = null;
    Socket socket = null;
    SocketThread st = null;
    //构造方法
    public SocketThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //通过输入将客户端发过的对象信息解析出来
            ois = new ObjectInputStream(socket.getInputStream());
            User user = (User)ois.readObject();
            String name = user.getName();
            String pwd = user.getPwd();
            //判断账号密码,将登录结果反馈给客户端
            dos = new DataOutputStream(socket.getOutputStream());
            if("lsc".equals(name) && "123456".equals(pwd)){
                dos.writeUTF("恭喜,登录成功!");
            }else{
                dos.writeUTF("对不起,账号或者密码不正确!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

User对象

package com.lsc.test01;

import java.io.Serializable;

/**
 * @author lishengchen
 * @version 1.0
 * @Date 2020/11/24
 */
public class User implements Serializable {
    private static final long serialVersionUID = 5325554995318095216L;
    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

好的,下面是一个简单的Spring Boot项目示例,它利用Socket实现了客户端和服务端之间的交互。 首先,我们需要创建一个Spring Boot项目,并在pom.xml添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 然后,我们需要创建一个WebSocket配置类,用于配置WebSocket端点和处理程序: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new SocketHandler(), "/api") .setAllowedOrigins("*"); } } ``` 在这个配置类,我们使用`@EnableWebSocket`注解启用WebSocket,并通过`registerWebSocketHandlers`方法注册了一个名为`/api`的WebSocket端点,以及一个`SocketHandler`处理程序。 接下来,我们需要创建一个`SocketHandler`处理程序,用于处理客户端和服务端之间的通信: ```java public class SocketHandler extends TextWebSocketHandler { private static final ObjectMapper mapper = new ObjectMapper(); @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 将客户端发送的JSON字符串转换为Map对象 Map<String, Object> request = mapper.readValue(message.getPayload(), new TypeReference<Map<String, Object>>() {}); // 调用服务端API,并将响应发送回客户端 String response = callApi(request); session.sendMessage(new TextMessage(response)); } private String callApi(Map<String, Object> request) throws Exception { // 调用服务端API,并将响应转换为JSON字符串 // 这里只是一个示例,具体的实现方式根据实际需求来确定 return mapper.writeValueAsString(apiService.call(request)); } } ``` 在这个处理程序,我们重写了`handleTextMessage`方法,用于处理客户端发送的消息。首先,我们将客户端发送的JSON字符串转换为一个Map对象,然后调用服务端API,并将响应发送回客户端。 最后,我们需要创建一个服务端API,用于处理客户端请求。这里只是一个示例,具体的实现方式根据实际需求来确定: ```java @Service public class ApiService { public Object call(Map<String, Object> request) { // 处理客户端请求,并返回响应 // 这里只是一个示例,具体的实现方式根据实际需求来确定 return null; } } ``` 这样,我们就完成了一个简单的使用Socket实现客户端和服务端之间交互的Spring Boot项目。通过这个项目,客户端和服务端可以通过WebSocket端点相互访问API。如果需要实现内网穿透,可以使用工具如ngrok将本地服务器映射到公共网络上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值