socket

来源:互联网 发布:js判断不等于0 编辑:程序博客网 时间:2024/06/16 08:12

public class Demo1_Receive {

/** ** 2.接收Receive * 创建DatagramSocket, 指定端口号 * 创建DatagramPacket, 指定数组, 长度 * 使用DatagramSocket接收DatagramPacket * 关闭DatagramSocket * 从DatagramPacket中获取数据 * @throws Exception  */public static void main(String[] args) throws Exception {    DatagramSocket socket = new DatagramSocket(6666);       //创建Socket相当于创建码头    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱    socket.receive(packet);                                 //接货,接收数据    byte[] arr = packet.getData();                          //获取数据    int len = packet.getLength();                           //获取有效的字节个数    System.out.println(new String(arr,0,len));    socket.close();}

}

public class Demo1_Send {

/** * * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket * @throws SocketException  * @throws UnknownHostException  */public static void main(String[] args) throws Exception {    String str = "what are you 弄啥呢?";    DatagramSocket socket = new DatagramSocket();               //创建Socket相当于创建码头    DatagramPacket packet =                                     //创建Packet相当于集装箱            new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);    socket.send(packet);                                        //发货,将数据发出去    socket.close();                                             //关闭码头}

}

public class Demo2_Receive {

/** ** 2.接收Receive * 创建DatagramSocket, 指定端口号 * 创建DatagramPacket, 指定数组, 长度 * 使用DatagramSocket接收DatagramPacket * 关闭DatagramSocket * 从DatagramPacket中获取数据 * @throws Exception  */public static void main(String[] args) throws Exception {    DatagramSocket socket = new DatagramSocket(6666);       //创建Socket相当于创建码头    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱    while(true) {        socket.receive(packet);                                 //接货,接收数据        byte[] arr = packet.getData();                          //获取数据        int len = packet.getLength();                           //获取有效的字节个数        String ip = packet.getAddress().getHostAddress();       //获取ip地址        int port = packet.getPort();                            //获取端口号        System.out.println(ip + ":" + port + ":" + new String(arr,0,len));    }}

}

public class Demo2_Send {

/** * * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket * @throws SocketException  * @throws UnknownHostException  */public static void main(String[] args) throws Exception {    Scanner sc = new Scanner(System.in);                        //创建键盘录入对象    DatagramSocket socket = new DatagramSocket();               //创建Socket相当于创建码头    while(true) {        String line = sc.nextLine();                            //获取键盘录入的字符串        if("quit".equals(line)) {            break;        }        DatagramPacket packet =                                 //创建Packet相当于集装箱                new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);        socket.send(packet);                                    //发货,将数据发出去    }    socket.close();                                             //关闭码头}

}

public class Demo3_MoreThread {

/** * @param args */public static void main(String[] args) {    new Receive().start();    new Send().start();}

}

class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6666); //创建Socket相当于创建码头
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱

        while(true) {            socket.receive(packet);                                 //接货,接收数据            byte[] arr = packet.getData();                          //获取数据            int len = packet.getLength();                           //获取有效的字节个数            String ip = packet.getAddress().getHostAddress();       //获取ip地址            int port = packet.getPort();                            //获取端口号            System.out.println(ip + ":" + port + ":" + new String(arr,0,len));        }    } catch (IOException e) {        e.printStackTrace();    }}

}

class Send extends Thread {
public void run() {
try {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
DatagramSocket socket = new DatagramSocket(); //创建Socket相当于创建码头

        while(true) {            String line = sc.nextLine();                            //获取键盘录入的字符串            if("quit".equals(line)) {                break;            }            DatagramPacket packet =                                 //创建Packet相当于集装箱                    new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);            socket.send(packet);                                    //发货,将数据发出去        }        socket.close();    }  catch (IOException e) {        e.printStackTrace();    }       }

}

public class Demo4_GUIChat extends Frame {

private TextField tf;private Button send;private Button log;private Button clear;private Button shake;private TextArea viewText;private TextArea sendText;private DatagramSocket socket;private BufferedWriter bw;/** * @param args * GUI聊天 */public Demo4_GUIChat() {    init();    southPanel();    centerPanel();    event();}public void event() {    this.addWindowListener(new WindowAdapter() {        @Override        public void windowClosing(WindowEvent e) {            try {                socket.close();                bw.close();            } catch (IOException e1) {                e1.printStackTrace();            }            System.exit(0);        }    });    send.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            try {                send();            } catch (IOException e1) {                e1.printStackTrace();            }        }    });    log.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            try {                logFile();            } catch (IOException e1) {                e1.printStackTrace();            }        }    });    clear.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            viewText.setText("");        }    });    shake.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            try {                send(new byte[]{-1},tf.getText());            } catch (IOException e1) {                e1.printStackTrace();            }        }    });    sendText.addKeyListener(new KeyAdapter() {        @Override        public void keyReleased(KeyEvent e) {            //if(e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) {    //isControlDown ctrl是否被按下            if(e.getKeyCode() == KeyEvent.VK_ENTER) {                try {                    send();                } catch (IOException e1) {                    e1.printStackTrace();                }            }        }    });}private void shake() {    int x = this.getLocation().x;                           //获取横坐标位置    int y = this.getLocation().y;                           //获取纵坐标位置    for(int i = 0; i < 20; i++) {        try {            this.setLocation(x + 20, y + 20);            Thread.sleep(20);            this.setLocation(x + 20, y - 20);            Thread.sleep(20);            this.setLocation(x - 20, y + 20);            Thread.sleep(20);            this.setLocation(x - 20, y - 20);            Thread.sleep(20);            this.setLocation(x, y);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}private void logFile() throws IOException {    bw.flush();                                 //刷新缓冲区    FileInputStream fis = new FileInputStream("config.txt");    ByteArrayOutputStream baos = new ByteArrayOutputStream();   //在内存中创建缓冲区    int len;    byte[] arr = new byte[8192];    while((len = fis.read(arr)) != -1) {        baos.write(arr, 0, len);    }    String str = baos.toString();               //将内存中的内容转换成了字符串    viewText.setText(str);    fis.close();}private void send(byte[] arr, String ip) throws IOException {    DatagramPacket packet =             new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 9999);    socket.send(packet);                        //发送数据}private void send() throws IOException {    String message = sendText.getText();        //获取发送区域的内容    String ip = tf.getText();                   //获取ip地址;    ip = ip.trim().length() == 0 ? "255.255.255.255" : ip;    send(message.getBytes(),ip);    String time = getCurrentTime();             //获取当前时间    String str = time + " 我对:" + (ip.equals("255.255.255.255") ? "所有人" : ip) + "说\r\n" + message + "\r\n\r\n";  //alt + shift + l 抽取局部变量    viewText.append(str);                       //将信息添加到显示区域中    bw.write(str);                              //将信息写到数据库中    sendText.setText("");}private String getCurrentTime() {    Date d = new Date();                        //创建当前日期对象    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");    return sdf.format(d);                       //将时间格式化}public void centerPanel() {    Panel center = new Panel();                 //创建中间的Panel    viewText = new TextArea();    sendText = new TextArea(5,1);    center.setLayout(new BorderLayout());       //设置为边界布局管理器    center.add(sendText,BorderLayout.SOUTH);    //发送的文本区域放在南边    center.add(viewText,BorderLayout.CENTER);   //显示区域放在中间    viewText.setEditable(false);                //设置不可以编辑    viewText.setBackground(Color.WHITE);        //设置背景颜色    sendText.setFont(new Font("xxx", Font.PLAIN, 15));    viewText.setFont(new Font("xxx", Font.PLAIN, 15));    this.add(center,BorderLayout.CENTER);}public void southPanel() {    Panel south = new Panel();                  //创建南边的Panel    tf = new TextField(15);    tf.setText("127.0.0.1");    send = new Button("发 送");    log = new Button("记 录");    clear = new Button("清 屏");    shake = new Button("震 动");    south.add(tf);    south.add(send);    south.add(log);    south.add(clear);    south.add(shake);    this.add(south,BorderLayout.SOUTH);         //将Panel放在Frame的南边}public void init() {    this.setLocation(500, 50);    this.setSize(400, 600);    new Receive().start();    try {        socket = new DatagramSocket();        bw = new BufferedWriter(new FileWriter("config.txt",true)); //需要在尾部追加    } catch (Exception e) {        e.printStackTrace();    }    this.setVisible(true);}private class Receive extends Thread {          //接收和发送需要同时执行,所以定义成多线程的    public void run() {        try {            DatagramSocket socket = new DatagramSocket(9999);            DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);            while(true) {                socket.receive(packet);             //接收信息                byte[] arr = packet.getData();      //获取字节数据                int len = packet.getLength();       //获取有效的字节数据                if(arr[0] == -1 && len == 1) {      //如果发过来的数组第一个存储的值是-1,并且数组长度是1                    shake();                        //调用震动方法                    continue;                       //终止本次循环,继续下次循环,因为震动后不需要执行下面的代码                }                String message = new String(arr,0,len); //转换成字符串                String time = getCurrentTime();     //获取当前时间                String ip = packet.getAddress().getHostAddress();   //获取ip地址                String str = time + " " + ip + " 对我说:\r\n" + message + "\r\n\r\n";                viewText.append(str);                bw.write(str);            }        } catch (Exception e) {            e.printStackTrace();        }    }}public static void main(String[] args) {    new Demo4_GUIChat();}

}