zoukankan      html  css  js  c++  java
  • 我决定出1.0的时候改名叫OIFaQ

      不过目前就算了。

      练练Socket,还有一点GUI

      这次直接用了默认包。

      原理很简单,客户端想办法搞到用户输入的内容,然后把用户ID和输入内容拿一个数组装起来,然后用ObjectOutputStream送到服务器端。

      服务器端接到了之后原样拆开,打印一下就行了。

      其实我根本不知道聊天程序该怎么实现……每个人都有一份server和一份client?

      写一点是一点吧……

      总之之后再学学。

      另外目前因为用的是TCP,似乎只能一对一,之后再研究研究UDP。

      

      Server的输入流名字起错了,不要在意。

      另外代码这么简单,没有注释也没关系的嘛,是吧。

     1 import java.io.*;
     2 import java.net.*;
     3 
     4 /**服务器端,目前是单纯的解包并在命令行打印,下个版本改。
     5  * 
     6  * @author mlxy
     7  * @version 0.4
     8  * */
     9 public class SimChatServer {
    10     public static void main(String[] args) {
    11         try {
    12             @SuppressWarnings("resource")
    13             ServerSocket ss = new ServerSocket(2333);
    14             
    15             System.out.println("Waiting...");
    16             Socket s = ss.accept();
    17             System.out.println("Client connected.");
    18             
    19             ObjectInputStream dis;
    20             
    21             boolean flag = true;
    22             while(flag) {
    23                 dis = new ObjectInputStream(s.getInputStream());
    24                 try {
    25                     String[] packReceived = (String[]) dis.readObject();
    26                     System.out.println(packReceived[0] + ": " + packReceived[1]);
    27                 }
    28                 catch (ClassNotFoundException e) {e.printStackTrace(); System.exit(-1);}
    29             }
    30             
    31         } catch(IOException e) {
    32             e.printStackTrace();
    33             System.exit(-1);
    34         }
    35         
    36     }
    37 }
    Server端
      1 import java.awt.*;
      2 import java.awt.event.*;
      3 
      4 import javax.swing.*;
      5 
      6 import java.io.*;
      7 import java.net.*;
      8 
      9 /**客户端程序。之后加上打开的时候先弹窗初始化用户ID的功能。
     10  * 
     11  * @author mlxy
     12  * @version 0.7
     13  * */
     14 public class SimChatClient extends JFrame {
     15     private static final long serialVersionUID = 1685352502599359548L;
     16     private JPanel panel;
     17     private JTextArea area;
     18     private JTextField field;
     19     private String userID;
     20     private StringBuffer chatRecord = new StringBuffer("");
     21     
     22     private Socket socket;
     23     private ObjectOutputStream oos;
     24     
     25     /**默认构造方法,初始化用户ID及框架内容。*/
     26     public SimChatClient() {
     27         try {socket = new Socket("192.168.1.104", 2333);}
     28         catch(IOException e) {e.printStackTrace(); System.out.println(-1);}
     29         
     30         setUserID("Default User");
     31         
     32         panel = new JPanel();
     33         panel.setLayout(new BorderLayout());
     34 
     35         area = new JTextArea();
     36         area.setLineWrap(true);
     37         area.setWrapStyleWord(true);
     38         area.setEditable(false);
     39         area.setBackground(new Color(255, 204, 255));
     40         JScrollPane scrollPane = new JScrollPane(area);
     41         
     42         field = new JTextField();
     43         field.setBackground(new Color(66, 204, 255));
     44         field.addActionListener(new FieldListener());
     45         
     46         panel.add(scrollPane, BorderLayout.CENTER);
     47         panel.add(field, BorderLayout.SOUTH);
     48         
     49         this.add(panel);
     50         this.addWindowListener(new WindowAdapter() {
     51             @Override
     52             public void windowActivated(WindowEvent e) {
     53                 super.windowActivated(e);
     54                 field.requestFocusInWindow();
     55             }
     56         });
     57         //this.pack();
     58     }
     59     
     60     /**自定义用户ID的构造方法。*/
     61     public SimChatClient(String userID) {
     62         this();
     63         this.setUserID(userID);
     64     }
     65     
     66     /**主运行方法。*/
     67     public static void main(String[] args) {
     68         try {
     69             UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
     70         } catch (UnsupportedLookAndFeelException e) {
     71             e.printStackTrace();
     72         } catch (ClassNotFoundException e) {
     73             e.printStackTrace();
     74         } catch (InstantiationException e) {
     75             e.printStackTrace();
     76         } catch (IllegalAccessException e) {
     77             e.printStackTrace();
     78         }
     79         
     80         launchFrame();
     81     }
     82     
     83     /**框架参数初始化。*/
     84     private static void launchFrame() {
     85         SimChatClient frame = new SimChatClient("mlxy");
     86         
     87         frame.setTitle("Simple Chat Online");
     88         frame.setSize(300, 400);
     89         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     90         frame.setLocationRelativeTo(null);
     91         frame.setVisible(true);
     92     }
     93     
     94     /**输入框的监听器。*/
     95     class FieldListener implements ActionListener {
     96         
     97         @Override
     98         public void actionPerformed(ActionEvent e) {
     99             //向服务器发送包。
    100             String[] packToSend = {userID, field.getText()};
    101             try {
    102                 oos = new ObjectOutputStream(socket.getOutputStream());
    103                 oos.writeObject(packToSend);
    104             }
    105             catch (IOException ex) {ex.printStackTrace(); System.exit(-1);}
    106             
    107             //更新单机窗口内容。###之后加上发送时间。
    108             chatRecord.append(userID + ": " + field.getText() + "
    ");
    109             area.setText(chatRecord.toString());
    110             field.setText("");
    111         }
    112     }
    113 
    114     public String getUserID() {return userID;}
    115     public void setUserID(String userID) {this.userID = userID;}
    116 }
    Client端
  • 相关阅读:
    MySQL内连接和外连接
    MySQL 重命名数据库
    linux查看文件大小
    Linux合并两个文件夹内容
    Linux压缩和解压命令
    深度学习反向求导
    深度学习网络压缩模型方法总结
    cuda培训素材
    cuda编程-卷积优化
    交叉熵代价函数(损失函数)及其求导推导
  • 原文地址:https://www.cnblogs.com/chihane/p/3523852.html
Copyright © 2011-2022 走看看