大数据Java基础第十五天、第十六天作业

使用Socket编写类似QQ通讯工具,显示屏幕的历史聊天记录待优化。

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;

import java.net.Socket;

import java.io.InputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.ObjectInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;

class ClientDemo{
    public static void main(String[] args) throws Exception{
        //String user_name = Integer.toString(socket.getPort());
        String user_name = "jiangmin";
        int random = (int)(1+Math.random()*(10-1+1));
        MyWindow window = new MyWindow();
        ClientMessage cm = new ClientMessage(window,user_name + random,0);
        cm.start();
    }
}

class MyWindow extends JFrame{
    private static final long serialVersionUID = -6944831795769317874L;
    private JTable table;
    private JTextArea in_text;
    private JTextArea out_text;
    public MyWindow(){
        ini();
    }
    public JTable getTable(){
        return table;
    }
    public void ini(){
        this.setSize(600,400);
        this.setLocation(200,200);
        this.setLayout(null);
        
        JButton btn = new JButton("button");
        
        this.add(btn);

        JTable table = new JTable();
        table.setBounds(500,0,100,400);
        this.add(table);
        this.table = table;

        JTextArea out_text = new JTextArea();
        out_text.setEditable(false);
        out_text.setBounds(0,0,480,300);
        this.add(out_text);
        this.out_text = out_text;

        JTextArea in_text = new JTextArea();
        in_text.setEditable(true);
        in_text.setBounds(0,310,400,50);
        this.add(in_text);
        this.in_text = in_text;
        
        JButton button = new JButton("Send");
        button.setBounds(410,310,70,50);
        button.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                StringBuilder builder = new StringBuilder();
                builder.append(in_text.getText());
                builder.append("\r\n");
                new ClientMessage(MyWindow.this,builder.toString(),1).start();
                in_text.setText("");
            }
        });
        this.add(button);
        this.setVisible(true);
    }
    public static void update(JTable table,final List<String> list){
        Set<String> set = new HashSet(list);
        final List<String> new_list = new ArrayList<String>(set);
        TableModel dataModel = new AbstractTableModel(){
            public int getColumnCount(){
                return 1;
            }
            public int getRowCount(){
                return new_list.size();
            }
            public Object getValueAt(int row,int column){
                return new_list.get(row);
            }
        };
        table.setModel(dataModel);
    }
    public static void history(MyWindow window,String out_content){
        window.out_text.setText(out_content);
    }
}

class ClientMessage{
    private MyWindow window;
    private String content;
    private int type;
    public ClientMessage(MyWindow window,String content,int type){
        this.window = window;
        this.content = content;
        this.type = type;
    }
    public void start(){
        try{
            Socket socket = new Socket("127.0.0.1",8888);
            new ClientPushThread(window,socket,content,type).start();
            new ClientPullThread(window,socket,content).start();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class ClientPushThread extends Thread{
    private MyWindow window;
    private Socket socket;
    private String content;
    private int type;
    public ClientPushThread(MyWindow window,Socket socket,String content,int type){
        super();
        this.window = window;
        this.socket = socket;
        this.content = content;
        this.type = type;
    }
    public void run(){
        System.out.println("push............");
        try{
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            byte[] write_buf = ClientUtil.MessagePack(type,content);
            out.write(write_buf);
            Thread.sleep(5000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class ClientPullThread extends Thread{
    private MyWindow window;
    private Socket socket;
    private String user_name;
    public ClientPullThread(MyWindow window,Socket socket,String user_name){
        super();
        this.window = window;
        this.socket = socket;
        this.user_name = user_name;
    }
    public void run(){
        while(true){
            System.out.println("pull............");
            try{
                DataInputStream in = new DataInputStream(socket.getInputStream());
                int type = in.read();
                int length = ClientUtil.readMessageLength(in);
                byte[] content_pack = ClientUtil.readMessage(in,length);
                if(type == 0){
                    ByteArrayInputStream bais = new ByteArrayInputStream(content_pack);
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    List<String> list = (List<String>)ois.readObject();
                    MyWindow.update(window.getTable(),list);
                }else if(type == 1){
                    MyWindow.history(window,new String(content_pack));
                    System.out.println("output text");
                }
                Thread.sleep(5000);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

class ClientUtil{
    public static byte[] readMessage(InputStream in,int length){
        try{
            byte[] bytes = new byte[length];
            in.read(bytes);
            return bytes;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    public static int readMessageLength(InputStream in){
        try{
            byte[] bytes = new byte[4];
            in.read(bytes);
            int i3 = bytes[0] << 24;
            int i2 = (bytes[1] & 0xFF) << 16;
            int i1 = (bytes[2] & 0xFF) << 8;
            int i0 = (bytes[3] & 0xFF);
            return i3 | i2 | i1 | i0;
        }catch(Exception e){
            e.printStackTrace();
        }
        return -1;
    }
    public static byte[] MessagePack(int type,String content){
        byte[] content_pack = content.getBytes();

        int length = content_pack.length;
        byte[] pack = new byte[1 + 4 + length];
        pack[0] = (byte)type;
        byte[] length_pack = ClientUtil.intToByteArr(length);
        System.arraycopy(length_pack,0,pack,1,4);
        
        System.arraycopy(content_pack,0,pack,5,length);
        return pack;
    }

    public static byte[] intToByteArr(int i){
        byte[] bytes = new byte[4];
        bytes[0] = (byte)(i >> 24);
        bytes[1] = (byte)(i >> 16);
        bytes[2] = (byte)(i >> 8);
        bytes[3] = (byte)i;
        return bytes;
    }
}

import java.net.ServerSocket;
import java.net.Socket;

import java.io.InputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectOutputStream;
import java.io.ByteArrayOutputStream;

import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;

class ServerDemo{
    public static void main(String[] args) throws Exception{
        System.out.println("start............");
        ServerMessage sm = new ServerMessage();
        sm.start();
        System.out.println("begin............");
    }
}

class ServerMessage{
    public static List<String> firends = new ArrayList<String>();
    public static List<Socket> sockets = new ArrayList<Socket>();
    public static StringBuilder builder = new StringBuilder();
    public void start(){
        try{
            ServerSocket ss = new ServerSocket(8888);
            while(true){
                Socket socket = ss.accept();
                sockets.add(socket);
                new ServerPullThread(socket,firends).start();
                new ServerPushThread(socket,firends,0).start();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class ServerPullThread extends Thread{
    private List<String> list ;
    private Socket socket;
    public ServerPullThread(Socket socket,List<String> list){
        super();
        this.socket = socket;
        this.list = list;
    }

    public void run(){
        while(true){
            try{
                DataInputStream in = new DataInputStream(socket.getInputStream());
                int type = in.read();
                int length = ServerUtil.readMessageLength(in);
                byte[] content_pack = ServerUtil.readMessage(in,length);
                if(type == 0){
                    System.out.println(content_pack.length);
                    System.out.println("pull............0");
                    String user_name = new String(content_pack,"utf-8");
                    list.add(user_name);
                }else if(type == 1){
                    System.out.println("pull............1");
                    new ServerPushThread(socket,content_pack,type).start();
                }
                Thread.sleep(5000);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

class ServerPushThread extends Thread{
    private Socket socket;
    private List<String> list = new ArrayList<String>();
    private byte[] content_pack;
    private int type;
    public ServerPushThread(Socket socket,List<String> list,int type){
        super();
        this.socket = socket;
        this.list = list;
        this.type = type;
    }
    public ServerPushThread(Socket socket,byte[] content_pack,int type){
        super();
        this.socket = socket;
        this.content_pack = content_pack;
        this.type = type;
    }
    public void run(){
        while(true){
            try{
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                if(type == 0){
                    System.out.println("push...........1");
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(baos);
                    oos.writeObject(list);
                    byte[] content_pack = baos.toByteArray();
                    byte[] pack = ServerUtil.MessagePack(type,content_pack);
                    out.write(pack);
                }else if(type == 1){
                    System.out.println("push...........1");
                    String content = new String(content_pack,"utf-8");
                    ServerMessage.builder.append(content);
                    byte[] new_content_pack = ServerMessage.builder.toString().getBytes();
                    byte[] pack = ServerUtil.MessagePack(type,new_content_pack);
                    out.write(pack);
                }else{
                    System.out.println("..........error");
                }
                Thread.sleep(5000);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

class ServerUtil{
    public static byte[] readMessage(InputStream in,int length){
        try{
            byte[] bytes = new byte[length];
            in.read(bytes);
            return bytes;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    public static int readMessageLength(InputStream in){
        try{
            byte[] bytes = new byte[4];
            in.read(bytes);
            int i3 = bytes[0] << 24;
            int i2 = (bytes[1] & 0xFF) << 16;
            int i1 = (bytes[2] & 0xFF) << 8;
            int i0 = (bytes[3] & 0xFF);
            return i3 | i2 | i1 | i0;
        }catch(Exception e){
            e.printStackTrace();
        }
        return -1;
    }
    public static byte[] intToByteArr(int i){
        byte[] bytes = new byte[4];
        bytes[0] = (byte)(i >> 24);
        bytes[1] = (byte)(i >> 16);
        bytes[2] = (byte)(i >> 8);
        bytes[3] = (byte)i;
        return bytes;
    }
    public static byte[] MessagePack(int type,byte[] content_pack){
        int length = content_pack.length;
        byte[] pack = new byte[1 + 4 + length];
        pack[0] = (byte)type;
        byte[] length_pack = intToByteArr(length);
        System.arraycopy(length_pack,0,pack,1,4);
        System.arraycopy(content_pack,0,pack,5,length);
        return pack;
    }
}
时间: 2024-12-20 22:13:11

大数据Java基础第十五天、第十六天作业的相关文章

从0开始学大数据-Java基础-三元运算符/键盘录入(4)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java运算符,其中三元运算符没有做讲解,本节我们开始学习Java基础-三元运算符/键盘录入,将会围绕以下几个知识点进行展开学习: 三元运算符 键盘录入数据 一.运算符 1.三元运算符 接着上一节的话题运算符,本节讲三元运算符,在讲三元运算符之前,可能会有很多朋友会问,是不是有一元运

从零开始学大数据-Java基础-switch语句(6)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节学习了流程控制语句,本节学习switch语句. 开始之前,我们先看一下上节的练习题. 一.练习题 if语句格式的练习: 1.获取两个数据中较大的值 2.判断一个数据是奇数还是偶数,并输出 程序执行结果如下: 二.switch语句 流程控制语句的选择结构 1 选择结构(也被称为分支结构)

【全集】大数据Java基础

课程介绍 本课程是由猎豹移动大数据架构师,根据Java在公司大数据开发中的实际应用,精心设计和打磨的大数据必备Java课程.通过本课程的学习大数据新手能够少走弯路,以较短的时间系统掌握大数据开发必备语言Java,为后续大数据课程的学习奠定了坚实的语言基础. 适用人群 1.想学大数据没有语言基础的学员 2.想学大数据没有Java语言基础的学员 3.转行想学大数据的学员 4.了解Java,大数据Java知识体系不完整的学员 课程视频下载地址(视频完整,无加密) 链接:https://pan.baid

从0开始学大数据-Java基础语法(2)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java的发展史和基本操作,本节我们开始学习Java语言的基础语法,将会围绕以下几个知识点进行展开学习: 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 PS:本节先学习前面4个知识点. 1.关键字 关键字的概述 · 被Java语言赋予特定含义的单词 关键字的特点 · 组

大数据Java基础第十五天作业

第一题:实现文件拆分.合并. import java.io.File; import java.io.RandomAccessFile; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.BufferedOutputStream; import java.io.BufferedInputStream; import java.util.List; import java.util.Arr

大数据JAVA基础第十天

1.继承extends(也叫扩展) 引入 首先写两个类: //定义学生类 class Student { //成员变量 private String name; private int age; //空构造 public Student(){} //getXxx()/setXxx() public void eat() { System.out.println("吃饭"); } } //定义教师类 class Teacher { //成员变量 private String name;

大数据Java基础第五天作业

第一题:     加载类的时候执行静态代码块,静态代码块的作用为了初始化值. 第二题:     构造代码块先于构造函数的调用,和方法声明的位置无关.顺序是:加载类 => 执行静态代码块      => 实例化类 => 执行构造代码块 => 执行构造函数.     构造代码块的作用也是为了初始化对象属性成员的值. 第三题:     会执行静态代码块,Class.forName("Benz",flase,BenzDemo.class.getClassLoader()

大数据JAVA基础第十四天

1.Java异常 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,输入值的范围,读取文件是否存在,网络是否始终保持通畅等等. 对于程序设计人员需要尽可能的预知所有可能发生的情况,尽可能的保证程序能在所有最糟糕的情况下都能运行. 但实际上,意外情况是不胜枚举的,程序可能发生的异常情况远远多于程序员所能考虑到的意外情况. Java的异常处理机制可以让程序具有良好的容错性,让程序更加健

大数据Java基础第十天作业

import java.util.List; import java.util.ArrayList; class ListDemo{          @SuppressWarnings(value="unchecked")     public static void main(String[] args){         List list = new ArrayList();         list.add(100);         list.add(new Integer