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

来源:互联网 发布:tb程序化交易模型源码 编辑:程序博客网 时间:2024/05/29 14:59

终于实现了最终版本的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());                    }                }            }        }    }}

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

阅读全文
0 0
原创粉丝点击