socket - 求高手点拨一个Java SWING的IM系统实验的错误解决方案。
天蓬老师
天蓬老师 2017-04-18 10:25:19
0
0
452

高手,您好:

小弟遇到的代码场景为:
制作了一个Java SWING技术结合Socket技术实现的IM通信实验。
通信为双向全双工通信,通信方分为S端和C端。
下面,小弟贴出小弟的全部实验源代码,请高手指导。
package pack.Server;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Server extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    Vector<Socket> v = new Vector<Socket>(); // 创建存放客户端连接套接字的集合
    int port;// 端口号
    JTextField jtf; // 设置为属性 方便写事件的时候使用

    public Server() { // 设置服务器默认窗口
        this.setTitle("基于TCP协议的服务器中转聊天");
        this.setSize(320, 100);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(d.width / 2 - getWidth() / 2, d.height / 2 - getHeight() / 2);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        setAlwaysOnTop(true);

        // 文本框 输入端口号
        jtf = new JTextField();
        jtf.setColumns(10);
        jtf.setBounds(10, 10, 80, 30);
        jtf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                char c = e.getKeyChar();
                if ('\n' == c) {
                    String s = jtf.getText();
                    if (s.matches("[0-9]{4,6}")) {
                        port = new Integer(s);
                        setVisible(false); // 该设置要放在服务区启动之前
                    } else {
                        jtf.setText("");
                        JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
                    }
                }
            }
        });
        this.add(jtf);
     // 按钮 启动服务器(事件)
        JButton jb = new JButton("启动服务器");
        jb.setBounds(180, 10, 100, 30);
        jb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String s = jtf.getText();
                if (s.matches("[0-9]{4,6}")) {
                    port = new Integer(s);
                    setVisible(false); // 该设置要放在服务区启动之前
                    begin();
//                    server();
                } else {
                    jtf.setText("");
                    JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
                }
            }
        });
        this.add(jb);
        this.setVisible(true);
    }

    public void begin() {
        // 创建服务器,并且不停等待客户端连接,并将客户端连接存入集合
        try {
            ServerSocket s = new ServerSocket(port);
            System.out.println("    ===="+port);
            System.out.println("服务器已创建...");
            while (true) {
                Socket c = s.accept();// 等待客户端响应
                System.out.println("客户端+[" + c.getInetAddress() + "]已连接");
                v.add(c); // 将连接的客户端套接字放入集合,存放起来
                // 启动转发线程
                Transmit t = new Transmit(c); // new一个线程实例
                t.start();
            }
        } catch (IOException e) {
            System.out.println("服务器启动出错");
        }
    }


    public static void main(String[] args) {
        new Server().setVisible(true);
    }
}

(上述为S端源代码)

package pack.Client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;

public class Client extends JFrame {
    String name; // 网名
    String ip; // ip地址
    int port; // 端口
    Socket c;// 客户端套接字

    JFrame jf1; // 客户端连接窗口
    JTextField jtf1; // 网名
    JTextField jtf2; // 输入IP的文本框
    JTextField jtf3; // 输入端口的文本框

    JFrame jf2;// 登陆界面窗口
    JTextField jtf4; // 输入账号的文本框
    JPasswordField jpf; // 输入密码的文本框
    JLabel jl;// 登录窗口的提示信息
    String user;
    String pwd;
    String pwd1;

    JFrame jf;// 聊天窗口
    JTextField jtf; // 聊天窗口发送文字的文本框
    JTextArea jta;// 聊天窗口的信息显示文本域

    JFrame jf3;// 注册窗口
    JTextField jtf6; // 注册账号的文本框
    JPasswordField jtf7;// 输入注册密码的文本框
    JPasswordField jtf8;// 确认密码
    JLabel jl1; // 账号提示信息
    JLabel jl2; // 密码提示信息
    JLabel jl3;// 密码提示信息

    static Map<String, String> map = new HashMap<String, String>();// 存放账号和密码
    // private JLabel label_1; //密码提示jlable

    // 连接服务器的窗口
    public Client() { // 默认设置
        jf1 = this; // 把当前对象设置为jf1;
        this.setTitle("客户端连接窗口");
        setSize(409, 139);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();// 获取当前屏幕size
        this.setLocation(d.width / 2 - getWidth() / 2, d.height / 2 - getHeight() / 2); // 设置窗口位置居中
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setAlwaysOnTop(true);
        getContentPane().setLayout(null);// 布局方式为绝对布局
        mouse m = new mouse(); // 新建一个鼠标事件类的实例
        jtf1 = new JTextField(); // 用户名文本框
        jtf1.setColumns(10);
        jtf1.setBounds(89, 10, 185, 30);
        jtf1.setText("admin"); // 默认用户
        jtf1.addMouseListener(m); // 给该文本框添加鼠标事件
        jf1.getContentPane().add(jtf1);
        jtf2 = new JTextField(); // ip文本框
        jtf2.setColumns(10);
        jtf2.setBounds(48, 50, 100, 30);
        jtf2.setText("127.0.0.1"); // 默认IP
        jtf2.addMouseListener(m); // 点击清除文本内容事件
        jf1.getContentPane().add(jtf2);
        jtf3 = new JTextField(); // port文本框
        jtf3.setColumns(10);
        jtf3.setBounds(204, 50, 70, 30);
        jtf3.setText("8888"); // 默认端口
        jtf3.addMouseListener(m);
        jf1.getContentPane().add(jtf3);

        JButton jb = new JButton("连接");// 连接按钮
        jb.setFont(new Font("宋体", Font.BOLD, 18));
        jb.setBounds(294, 28, 89, 52);
        jf1.getContentPane().add(jb);

        JLabel label = new JLabel("用户名:");
        label.setFont(new Font("仿宋", Font.BOLD, 12));
        label.setBounds(25, 17, 54, 15);
        jf1.getContentPane().add(label);
        JLabel lblIp = new JLabel("IP:");
        lblIp.setFont(new Font("仿宋", Font.BOLD, 12));
        lblIp.setBounds(25, 57, 54, 15);
        jf1.getContentPane().add(lblIp);

        JLabel lblPort = new JLabel("PORT:");
        lblPort.setFont(new Font("仿宋", Font.BOLD, 12));
        lblPort.setBounds(160, 57, 54, 15);
        jf1.getContentPane().add(lblPort);
        jb.addActionListener(new ActionListener() { // 点击“连接”触发事件
            public void actionPerformed(ActionEvent e) {
                name = jtf1.getText();
                String s = jtf2.getText();
                String s1 = jtf3.getText();
                if (s.matches(
                        "\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\."
                                + "((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b")
                        && s1.matches("[0-9]{4,6}")) {
                    ip = s;
                    port = new Integer(s1);
                    jf1.setVisible(false); // 原窗口隐藏
                    begin(); // 调用客户端启动方法
                } else {
                    JOptionPane.showMessageDialog(jf1, "请输入正确的地址或IP!");
                    jtf2.setText("");
                    jtf3.setText("");
                }
            }
        });
    }

    // 连接服务器的方法
    public void begin() {
        try {
            System.out.println("ip===="+ip+"    "+"port===="+port);
            c = new Socket(ip, port);
            System.out.println("客户端请求连接...");
            new Recevie(c).start(); // 启接收信息的线程
            // map.put("admin", "123456");
            login(); // 登录窗口
        } catch (IOException e) {
            JOptionPane.showMessageDialog(jf1, "请检查服务器是否开启,ip地址和端口是否正确...");
            e.printStackTrace();
        }
    }

    // 登录窗口
    public void login() {
        // 导入用户信息
        load();
        // 声明
        Dimension d;
        JLabel jl1, jl2;
        JButton jb1, jb2;
        // 创建设置窗口
        jf2 = new JFrame();
        jtf4 = new JTextField(); // 账号输入框
        jl1 = new JLabel("账号");
        // 设置控件
        jf2.setTitle("登陆");
        jf2.setSize(333, 242);
        jf2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d = Toolkit.getDefaultToolkit().getScreenSize();
        jf2.setLocation(d.width / 2 - jf2.getWidth() / 2, d.height / 2 - jf2.getHeight() / 2);
        jf2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf2.getContentPane().setLayout(null);
        jtf4.setBounds(86, 22, 198, 31);
        jtf4.setColumns(10);

        jl1.setFont(new Font("宋体", Font.BOLD, 16));
        jl1.setBounds(30, 22, 54, 31);
        jpf = new JPasswordField(); // 登录界面 输入密码
        jpf.setBounds(87, 82, 197, 31);
        jpf.setColumns(10);
        jl2 = new JLabel("密码");
        jl2.setFont(new Font("宋体", Font.BOLD, 16));
        jl2.setBounds(30, 90, 54, 15);
        jb1 = new JButton("注册");
        jb1.setBounds(34, 171, 93, 23);
        jb2 = new JButton("登录");
        jb2.setBounds(164, 171, 93, 23);
        jl = new JLabel(""); // 账号密码登录信息提示
        jl.setBounds(48, 138, 236, 23);

        // 添加控件
        jf2.getContentPane().add(jpf);
        jf2.getContentPane().add(jl1);
        jf2.getContentPane().add(jtf4);
        jf2.getContentPane().add(jl2);
        jf2.getContentPane().add(jb1);
        jf2.getContentPane().add(jb2);
        jf2.getContentPane().add(jl);

        // 添加事件
        jtf4.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                jl.setText(""); // 账号提示信息
            }
        });

        jpf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if ('\n' == e.getKeyChar()) { // 按键事件 按回车键发送信息
                    Set<String> set = map.keySet();
                    for (String string : set) {
                        String u = string;
                        String p = map.get(string);
                        if (jtf4.getText().equals(u) && jpf.getText().equals(p)) {
                            jf2.setVisible(false);
                            LT();
                        }
                    }
                    jl.setText("账号或者密码错误!!");
                    jtf4.setText("");
                    jpf.setText("");
                }
            }
        });
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                jf2.setVisible(false);
                zhuce();
            }
        });
        jb2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Set<String> set = map.keySet();
                for (String string : set) {
                    String u = string;
                    String p = map.get(string);
                    if (jtf4.getText().equals(u) && jpf.getText().equals(p)) {
                        jf2.setVisible(false);
                        LT();
                    }
                }
                jl.setText("账号或者密码错误!!");
                jtf4.setText("");
                jpf.setText("");
            }
        });

        jf2.setVisible(true);
        ServerSocket ss = null;
        
        try {
            ss = new ServerSocket(9999);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        while(true){
        Socket s = null;
        try {
            s = ss.accept();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Transmit obj = new Transmit(s);
        obj.start();
        }
    }

    // 注册窗口
    public void zhuce() {

        // 局部变量
        JLabel jl11, jl22, jl33;
        JButton jb1;

        // 创建窗口、事件实例
        jf3 = new JFrame();
        key1 k1 = new key1();
        mouse m = new mouse();

        // 窗口默认设置
        jf3.getContentPane().setFont(new Font("宋体", Font.PLAIN, 13));
        jf3.setTitle("\u6CE8\u518C");
        jf3.setSize(411, 287);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        jf3.setLocation(d.width / 2 - jf3.getWidth() / 2, d.height / 2 - jf3.getHeight() / 2);
        jf3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf3.getContentPane().setLayout(null);

        // 基本控件的设置
        jtf6 = new JTextField(); // 输入账号的文本框
        jtf6.setBounds(109, 26, 226, 23);
        jtf6.setColumns(10);
        jtf7 = new JPasswordField(); // 第一次输入密码的文本框
        jtf7.setColumns(10);
        jtf7.setBounds(109, 84, 226, 23);
        jtf8 = new JPasswordField(); // 第二次输入密码的文本框
        jtf8.setColumns(10);
        jtf8.setBounds(109, 145, 226, 23);
        jl1 = new JLabel("");
        jl1.setBounds(40, 59, 308, 15);
        jl2 = new JLabel("");
        jl2.setBounds(27, 120, 308, 15);
        jl3 = new JLabel("");
        jl3.setBounds(27, 178, 308, 15);
        jb1 = new JButton("提交"); // 注册信息确认按钮
        jb1.setBounds(109, 203, 93, 23);
        jl11 = new JLabel("请输入账号");
        jl11.setFont(new Font("宋体", Font.BOLD, 12));
        jl11.setBounds(30, 26, 69, 23);
        jl22 = new JLabel("请输入密码");
        jl22.setFont(new Font("宋体", Font.BOLD, 12));
        jl22.setBounds(30, 84, 69, 23);
        jl33 = new JLabel("请再次密码");
        jl33.setFont(new Font("宋体", Font.BOLD, 12));
        jl33.setBounds(30, 145, 69, 23);
        // 面板添加控件
        jf3.getContentPane().add(jl11);
        jf3.getContentPane().add(jl22);
        jf3.getContentPane().add(jl33);
        jf3.getContentPane().add(jb1);
        jf3.getContentPane().add(jl1);
        jf3.getContentPane().add(jl2);
        jf3.getContentPane().add(jl3);
        jf3.getContentPane().add(jtf6);
        jf3.getContentPane().add(jtf7);
        jf3.getContentPane().add(jtf8);

        // 添加事件
        jtf6.addKeyListener(k1);
        jtf7.addKeyListener(k1);
        jtf8.addKeyListener(k1);
        jtf6.addMouseListener(m);
        jtf7.addMouseListener(m);
        jtf8.addMouseListener(m);
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                user = jtf6.getText();
                pwd = jtf7.getText();
                pwd1 = jtf8.getText();
                if (user.matches("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$")) {
                    if (pwd.equals(pwd1)) {
                        if (pwd.matches("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$")) {
                            map.put(user, pwd);
                            save(map);
                            JOptionPane.showMessageDialog(jf3, "注册成功!");
                            jf3.setVisible(false);
                            jf2.setVisible(true);
                        } else {
                            jl2.setText("(密码长度大于等于6且必须包含字符和数字)");
                        }
                    } else {
                        jl3.setText("(两次输入的密码必须一致)");
                    }
                } else {
                    jl1.setText("(用户名长度大于等于6且必须包含字符和数字)");
                }
            }
        });
        jf3.setVisible(true);
    }

    // 聊天窗口
    public void LT() {

        // 声明局部变量
        Dimension d;
        JScrollPane jsp;
        JButton jb1, jb2, jb3;

        // 创建实例
        key k = new key();
        jf = new JFrame();
        JPanel jp2 = new JPanel();

        // 设置窗口
        jf.setBackground(new Color(255, 255, 240));
        jf.setTitle("基于TCP协议的聊天窗口---当前用户:" + name);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(400, 300);
        jf.setAlwaysOnTop(true);
        d = Toolkit.getDefaultToolkit().getScreenSize();
        jf.setLocation(d.width / 2 - jf.getWidth() / 2, d.height / 2 - jf.getHeight() / 2);

        // 设置控件
        jp2.setLayout(new BorderLayout(0, 0));
        jta = new JTextArea(); // 聊天窗口
        jta.setBackground(new Color(255, 255, 240));
        jta.setFocusable(false);// 禁止鼠标光标进入
        jsp = new JScrollPane(jta); // 设置滚屏
        jsp.setBorder(new TitledBorder("聊天内容")); // 设置边框标题
        jb1 = new JButton("抖动"); // 抖动按钮
        jb1.setFont(new Font("微软雅黑", Font.BOLD, 12));
        jtf = new JTextField(); // 发送文本框
        jtf.setBackground(new Color(255, 255, 240));
        jtf.setColumns(15);
        jb3 = new JButton("清空");
        jb3.setFont(new Font("宋体", Font.BOLD, 12));
        jb3.setHorizontalAlignment(SwingConstants.RIGHT);
        jb2 = new JButton("发送");
        jb2.setFont(new Font("微软雅黑", Font.BOLD, 13));

        // 添加控件
        jp2.add(jb1, BorderLayout.WEST);
        jp2.add(jtf, BorderLayout.NORTH);
        jp2.add(jb3, BorderLayout.EAST);
        jf.getContentPane().add(jsp);
        jf.getContentPane().add(jp2, BorderLayout.SOUTH);
        jp2.add(jb2, BorderLayout.CENTER);

        // 添加事件
        jtf.addKeyListener(k);
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                BufferedWriter bw;
                try {
                    bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
                    bw.write("dyd\n");
                    bw.flush();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        });
        jb2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Send();
            }
        });
        jb3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jta.setText("");
            }
        });
        // 设置窗口可视化
        jf.setVisible(true);
    }

    // 成员内部类-自定义鼠标事件-清空文本框内容
    public class mouse extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            JTextField j = (JTextField) e.getSource();
            j.selectAll(); // 鼠标点击事件 点击清空文本框内容
        }
    }

    // 成员内部类-自定义按键事件-回车发送信息
    public class key extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            if ('\n' == e.getKeyChar()) { // 按键事件 按回车键发送信息
                Send();
            }
        }
    }

    // 成员内部类-自定义按键事件-回车确认注册信息
    public class key1 extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            if ('\n' == e.getKeyChar()) { // 按键事件 按回车键发送信息
                user = jtf6.getText();
                pwd = jtf7.getText();
                pwd1 = jtf8.getText();
                if (user.matches("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$")) {
                    if (pwd.equals(pwd1)) {
                        if (pwd.matches("^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$")) {
                            map.put(user, pwd);
                            save(map);
                            JOptionPane.showMessageDialog(jf3, "注册成功!");
                            jf3.setVisible(false);
                            jf2.setVisible(true);
                        } else {
                            jl2.setText("(密码长度大于等于6且必须包含字符和数字)");
                        }
                    } else {
                        jl3.setText("(两次输入的密码必须一致)");
                    }
                } else {
                    jl1.setText("(用户名长度大于等于6且必须包含字符和数字)");
                }
            }
        }

    }

    // 成员内部类-接收聊天信息的线程
    public class Recevie extends Thread {
        Socket c;

        public Recevie(Socket c) {
            this.c = c;
        }

        public void run() {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                while (true) {
                    String s = br.readLine();
                    if (s.equals("dyd")) {
                        for (int i = 0; i < 100; i++) {
                            if (i % 2 != 0)
                                jf.setLocation(jf.getX() - 5, jf.getY() + 5);
                            else
                                jf.setLocation(jf.getX() + 5, jf.getY() - 5);
                        }
                        sleep(400);
                        continue;
                    }
                    jta.append(s + "\n");
                    jta.setCaretPosition(jta.getDocument().getLength()); // 设置光标自动跟踪文本内容
                }
            } catch (IOException e) {
                JOptionPane.showMessageDialog(jf, "服务器已关闭");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 发送聊天信息的方法
    public void Send() {
        try {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
            String time = new SimpleDateFormat("H:m:s").format(new Date().getTime());
            String time1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date().getTime());
            bw.write(time1 + "\n" + time + "  " + name + ":" + jtf.getText() + "\n");
            bw.flush();
            jtf.setText("");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 保存用户信息的方法
    public void save(Map map) {
        try {
            // System.out.println("测试保存");
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/save/user.txt"));
            oos.writeObject(map);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 读取信息的方法
    public void load() {
       
            
            
            String paths=new File("a").getAbsolutePath();
            System.out.println(paths+"\\user.txt");
            
            ObjectInputStream ois;
            try {
                FileInputStream f=    new FileInputStream("D:\\javatest\\a.txt");
                
                
                ois = new ObjectInputStream(f);
            
            Object o;
              
                
                    o = ois.readObject();
                 
                
                 map = (Map<String, String>) o;
                    ois.close();
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //Object o =  new Object();
           
       

    }

    public static void main(String[] args) {
        new Client().setVisible(true);
    }
}

(上述为C端源代码)

package pack.Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.HashMap;


    public class Transmit extends Thread { // 实现转发功能的线程
        Socket c;
        HashMap<String,Socket> socketlib = new HashMap<String,Socket>();
        
        public Transmit(Socket c){
            this.c= c;
        }

        public void run() {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                while (true) { // 循环读取
                    String s = br.readLine();
                    System.out.println("++++Server服务端split函数上方++++"+s);
                    String[] str = s.split("丗");
                    String myuserId = str[0];
                    String myuserrole = str[1];
                    String myobjId = str[2];
                    String myobjrole = str[3];
                    String myInfo = str[4];
                    System.out.println(myuserId+"    "+myuserrole+"    "+myobjId+"    "+myobjrole+"    "+myInfo);
                    socketlib.put(myuserId, this.c);
                    WriteStr ws = new WriteStr(this.c,"CJCO丗C丗CJCO丗C");
                    ws.start();
                }
            } catch (IOException e) {
                System.out.println(c.getInetAddress() + "已退出");
            }
        }
    }

(上述为S端和C端内的Transmit类型的源代码)

package pack.Server;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class WriteStr extends Thread{
    static Socket s = null;
    BufferedWriter bw = null;
    String str = null;
    
    public WriteStr(Socket s,String str){
        this.s = s;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(this.s.getOutputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.str=str;
    }
    
    public void run(){
        try {
            bw.write("CJCO"+this.str);
            System.out.println("CJCO"+this.str);

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

(上述为S端与C端内的Transmit的WriterStr类与S端与C端之内含有的WriteStr类型的源代码)
小弟按照,首先运行“Server”类,接着运行“Client”类,得到了下面的报错现场与运行结果:

希望高手能够点拨:
小弟的IM系统实验,故障出在哪里?小弟应该如何修改?
谢谢高手!!

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(0)
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal