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
- Java Socket学习(三)——客户端之间通信
- java与c语言之间的socket通信—java客户端c服务器端
- java与c语言之间的socket通信—c客户端java服务器端
- C# 多线程学习(三)Socket 服务器与客户端通信
- java - socket通信 客户端
- Java Socket 通信 (三)
- java用socket客户端和服务器之间通信,传输文件经典例子(详细分析)
- java学习小笔记(三.socket通信)
- Socket通信——C++服务器端和Java客户端
- java socket编程—单客户端与服务器通信
- socket编程(二)通过服务端实现客户端之间通信
- socket建立服务端和客户端之间通信
- Java Socket应用(七)——使用多线程实现多客户端的通信
- socket实现客户端与服务端通信(三)服务端升级
- 【Java Socket】入门系列 3.2.编程实现基于 TCP 的 Socket 通信 — 服务器端和客户端
- socket实现客户端和客户端之间通信和聊天
- Socket客户端(三)
- Java并发编程学习(三)——线程通信
- c++ 子类父类 的构造函数调用顺序
- BZOJ 1529: [POI2005]ska Piggy banks
- STL(二十)priority_queue优先队列容器
- Linux下显示颜色
- 与串口通信相关
- Java Socket学习(三)——客户端之间通信
- leetcode 35. Search Insert Position
- 基于pdf.js简单在线pdf文件预览跨域解决方案,兼容性好!
- gson 2.7 学习笔记
- HDU 1084 What Is Your Grade?(排序)
- BZOJ 1790: [Ahoi2008]Rectangle 矩形藏宝地
- N
- STL中各容器支持的迭代器的类别
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)