Java Socket学习(三)——客户端之间通信

本文介绍了一个简单的即时通讯系统的实现过程,包括客户端之间的消息传递机制。通过定义Message类来封装消息内容,并利用Java Socket编程实现服务端逻辑,支持客户端间的消息转发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于实现了最终版本的1.0版,后续应该还有很多需要完善的地方,慢慢提高吧。本篇文章记录的是当初想要实现的最初版本,客户端A给客户端B发送消息

上一篇的基础上,修改了Message.class的成员变量,和服务端的逻辑。具体代码如下(安卓端写的有些冗余,就先不贴了):

Message.class
package Bean;

public class Message {
    private String from;//来自哪
    private String to;//发给谁
    private String msg;//包含的内容
    private String clientID; //客户端ID

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getClientID() {
        return clientID;
    }

    public void setClientID(String clientID) {
        this.clientID = clientID;
    }

    public Message() {
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
服务端代码
package com.imudges.j2se.network;

import Bean.Message;
import com.google.gson.Gson;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class Server {
    private Socket socket;
    //声明一个ServerSocket对象
    private ServerSocket serverSocket;
    //输入流
    private BufferedReader bufferedReader;
    //输出流
    private PrintWriter printWriter;
    //储存所有连接的socket
    private Map<String ,Socket> clientSocket = new HashMap<>();

    private Gson gson = new Gson();
    /**
     * 构造函数
     * */
    public Server() {}


    public static void main(String args[]){
        Server server = new Server();
        server.getServer();
    }

    /**
     * 获取连接
     * */
    public void getServer(){
        try {
            serverSocket = new ServerSocket(6666);//绑定的端口为2017,此端口要与客户端请求的一致
            while(true){
                System.err.println("等待客户端连接......");
                //从队列中取出Socket或等待连接
                socket = serverSocket.accept();
                if (socket.isConnected()){
                    System.out.println("连接成功!");
                }
                //开新的线程,为这个socket服务
                new HandlerThread(socket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 实现一个Runnable接口,处理和client的一些事物
     * */
    private class HandlerThread implements Runnable{
        private Socket socket;

        /**
         * 保存每次连接的socket
         * */
        private void saveSocket(String cilentID,Socket socket){
            if(cilentID != null && socket != null){
                clientSocket.put(cilentID,socket);
            } else {
                System.err.println("clientID 或 Socket发生错误");
            }
        }

        /**
         * 给socket发送消息,内容为msg
         **/
        private void sendMsg(String msg,Socket s){
            //合法性判断
            if(msg != null && s != null){
                //判断socket是否连接
                if(s.isConnected()){
                    try {
                        PrintWriter p = new PrintWriter(s.getOutputStream());
                        p.println(msg);
                        p.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.err.println("socket已断开");
                }
            } else {
                System.err.println("发送信息错误!");
            }
        }

        public HandlerThread(Socket socket) {
            this.socket = socket;

            new Thread(this).start();
        }

        @Override
        public void run() {
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
                //处理客户端发来的数据
                String clientMsg = null;
                while ((clientMsg = bufferedReader.readLine())!=null){
                    System.out.println("客户端发来的消息:" + clientMsg);
                    Message msg = gson.fromJson(clientMsg,Message.class);
                    //储存socket
                    saveSocket(msg.getClientID(),this.socket);
                    if(msg.getTo() != null ){

                        sendMsg(clientMsg,clientSocket.get(msg.getTo()));

                    }
                    //向客户端回复信息
//                    printWriter = new PrintWriter(socket.getOutputStream());
//                    printWriter.println("ok");
//                    printWriter.flush();

                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        socket = null;
                        System.err.println("服务器finally异常,异常信息:" + e.getMessage());
                    }
                }
            }
        }
    }
}

嗯,就酱紫,如果有什么问题,非常欢迎在讨论区提出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值