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

xiaoxiao2021-02-28  101

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

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

转载请注明原文地址: https://www.6miu.com/read-97060.html

最新回复(0)