网络多线程——多用户即时通信系统(3)——客户端线程部分

客户端线程

在这里插入图片描述

UserClientService



package com.qqclient.service;

import com.qqcommon.Message;
import com.qqcommon.MessageType;
import com.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 11:09 2021/10/14
 */
public class UserClientService {

    private User user = new User();
    Socket socket = new Socket();

    public boolean checkUser(String userId, String passwd){
        // 创建 User 对象
        user.setUserId(userId);
        user.setPasswd(passwd);
        // 连接到服务端,发送 user 对象
        try {
            socket = new Socket(InetAddress.getLocalHost(), 9999);
            // 得到 ObjectOutputStream 对象,发送 user 对象
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(user);

            // 读取从服务器回复的 Message 消息
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message msg = (Message) ois.readObject();

            // 根据 Message 消息判断登录是否成功
            if(msg.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)){
                // 创建一个和服务器端保持通信的线程,-> 创建一个类:ClientConnectServerThread
                // 等待...

            }else{

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}



ClientConnectServerThread



package com.qqclient.service;

import com.qqcommon.Message;

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

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 11:20 2021/10/14
 */
public class ClientConnectServerThread extends Thread{

    // 线程要持有 Socket 对象
    private Socket socket;

    // 构造器,传入 Socket 参数
    public ClientConnectServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // 因为客户端要和服务端持续进行通信,所以需要用到 while 循环
        while(true){
            try {
                // 客户端线程,等待读取从服务端发送过来的消息
                System.out.println("客户端线程,等待读取从服务端发送过来的消息");
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                // 如果服务端没有发送 Message 对象,则线程在这里会阻塞
                Message msg = (Message) ois.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 为了更方便地得到 Socket 对象
    public Socket getSocket() {
        return socket;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值