终于实现了最终版本的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;
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;
private ServerSocket serverSocket;
private BufferedReader bufferedReader;
private PrintWriter printWriter;
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);
while(
true){
System.err.println(
"等待客户端连接......");
socket = serverSocket.accept();
if (socket.isConnected()){
System.out.println(
"连接成功!");
}
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){
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);
saveSocket(msg.getClientID(),
this.socket);
if(msg.getTo() !=
null ){
sendMsg(clientMsg,clientSocket.get(msg.getTo()));
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if(socket !=
null){
try {
socket.close();
}
catch (IOException e) {
socket =
null;
System.err.println(
"服务器finally异常,异常信息:" + e.getMessage());
}
}
}
}
}
}
嗯,就酱紫,如果有什么问题,非常欢迎在讨论区提出。