模拟Socket的通讯----(3)---服务器端--可忽略

来源:互联网 发布:怎么用邮箱注册知乎 编辑:程序博客网 时间:2024/05/21 08:36
2.服务器端
------------------使用Map<K,V>集合保存连接的Sockets;K为客户端注册的信息,V是对应的socket
------------------开启线程保存不同的Sockets
------------------解析数据中待用的地址,然后在集合中get对应的Socket,然后发送信息;

1.服务器端
------------------使用Map<K,V>集合保存连接的Sockets;K为客户端注册的信息,V是对应的socket
------------------开启线程保存不同的Sockets
------------------解析数据中待用的地址,然后在集合中get对应的Socket,然后发送信息;

实际开发中可能还是会涉及服务器端之间的同学,还有就是数据库的拿去注册信息,寻找对应的socket,在这里只用单个SocketServer代替



package org.itheima.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class SoketServer_4 {

    //
    private static Map<String, Socket> clients = new LinkedHashMap<String, Socket>();

    public static void main(String[] args) {

        int port = 9999;
        try {
            // 1.创建服务器
            ServerSocket server = new ServerSocket(port);
            System.out.println("创建服务器");

            while (true) {
                // 2. 获取客户端的连接
                System.out.println("准备accept");
                // 保存客户端的实例
                final Socket client = server.accept();// 阻塞式
                System.out.println("accept完成");

                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            // 获取输入流
                            InputStream is = client.getInputStream();

                            byte[] buffer = new byte[1024];
                            int len = -1;
                            // 阻塞式方法
                            System.out.println("准备读取");
                            while ((len = is.read(buffer)) != -1) {
                                System.out.println("读取完成");
                                String data = new String(buffer, 0, len);

                                System.out.println("输入的内容 :" + data);

                                // http --> 消息行,消息头,内容 ---->data
                                // session --> header ---> tomcat
                                // --->map<session,value>
                                // data --> data
                                // data --> #A --> 发送的是认证信息
                                // data --> 不是以# --> 文本信息 --> 对应的是谁 A#abcd

                                // 简易模型
                                //1. 认证
                                //2. 发送消息
                                //3. 朋友邀请 -->重新定义数据格式

                                if (data.startsWith("#")) {
                                    // 认证信息,将client放到池子中
                                    System.out.println("认证" + data);
                                    clients.put(data, client);
                                } else {
                                    // 文本消息
                                    String[] split = data.split("#");

                                    Socket c = clients.get("#" + split[0]);
                                    if (c != null) {
                                        System.out.println("给" + split[0]
                                                + "发送" + split[1]);
                                        OutputStream os = c.getOutputStream();
                                        os.write(split[1].getBytes());
                                    }
                                }

                                // 将消息转给对应的人
                                // for (Socket c : clients) {
                                // if (c != client) {
                                //
                                // OutputStream os = c.getOutputStream();
                                // os.write(data.getBytes());
                                // }
                                // }
                            }

                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }).start();

            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}


0 0
原创粉丝点击