首页 > 编程 > Java > 正文

基于Java Socket实现一个简易在线聊天功能(一)

2019-11-26 14:19:51
字体:
来源:转载
供稿:网友

最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到武林网平台,以此做个记录,方便自己和大家使用。

先给大家说下实现步骤分这样几大步:

1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;

2、结合线程,实现多客户端连接服务端发送消息;

3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;

4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现。

这里首先实现第一步的简单功能,难点在于:

1、没有用过awt组件,没有用过java相关的监听事件;

2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。

实现功能的代码如下:

客户端:

package chat.chat; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; /**  * 在线聊天客户端 1、生成图形窗口界面轮廓 2、为轮廓添加关闭事件 3、在轮廓中加入输入区域和内容展示区域 4、为输入区域添加回车事件  * 5、建立服务端连接并发送数据  *  * @author tuzongxun123  *  */ public class ChatClient extends Frame {   // 用户输入区域   private TextField tfTxt = new TextField();   // 内容展示区域   private TextArea tarea = new TextArea();   private Socket socket = null;   // 数据输出流   private DataOutputStream dataOutputStream = null;   public static void main(String[] args) {     new ChatClient().launcFrame();   }   /**    * 建立一个简单的图形化窗口    *    * @author:tuzongxun    * @Title: launcFrame    * @param    * @return void    * @date May 18, 2016 9:57:00 AM    * @throws    */   public void launcFrame() {     setLocation(300, 200);     this.setSize(200, 400);     add(tfTxt, BorderLayout.SOUTH);     add(tarea, BorderLayout.NORTH);     pack();     // 监听图形界面窗口的关闭事件     this.addWindowListener(new WindowAdapter() {       @Override       public void windowClosing(WindowEvent e) {         System.exit(0);         disConnect();       }     });     tfTxt.addActionListener(new TFLister());     setVisible(true);     connect();   }   /**    * 连接服务器    *    * @author:tuzongxun    * @Title: connect    * @param    * @return void    * @date May 18, 2016 9:56:49 AM    * @throws    */   public void connect() {     try {       // 新建服务端连接       socket = new Socket("127.0.0.1", 8888);       // 获取客户端输出流       dataOutputStream = new DataOutputStream(socket.getOutputStream());       System.out.println("连上服务端");     } catch (UnknownHostException e) {       e.printStackTrace();     } catch (IOException e) {       e.printStackTrace();     }   }   /**    * 关闭客户端资源    *    * @author:tuzongxun    * @Title: disConnect    * @param    * @return void    * @date May 18, 2016 9:57:46 AM    * @throws    */   public void disConnect() {     try {       dataOutputStream.close();       socket.close();     } catch (IOException e) {       e.printStackTrace();     }   }   /**    * 向服务端发送消息    *    * @author:tuzongxun    * @Title: sendMessage    * @param @param text    * @return void    * @date May 18, 2016 9:57:56 AM    * @throws    */   private void sendMessage(String text) {     try {       dataOutputStream.writeUTF(text);       dataOutputStream.flush();     } catch (IOException e1) {       e1.printStackTrace();     }   }   /**    * 图形窗口输入区域监听回车事件    *    * @author tuzongxun123    *    */   private class TFLister implements ActionListener {     @Override     public void actionPerformed(ActionEvent e) {       String text = tfTxt.getText().trim();       tarea.setText(text);       tfTxt.setText("");       // 回车后发送数据到服务器       sendMessage(text);     }   } } 

服务端:

package chat.chat; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; /**  * java使用socket和awt组件简单实现在线聊天功能服务端 可以实现一个客户端连接后不断向服务端发送消息  * 但不支持多个客户端同时连接,原因在于代码中获得客户端连接后会一直循环监听客户端输入,造成阻塞  * 以至于服务端无法二次监听另外的客户端,如要实现,需要使用异步或者多线程  *  * @author tuzongxun123  *  */ public class ChatServer {   public static void main(String[] args) {     // 是否成功启动服务端     boolean isStart = false;     // 服务端socket     ServerSocket ss = null;     // 客户端socket     Socket socket = null;     // 服务端读取客户端数据输入流     DataInputStream dataInputStream = null;     try {       // 启动服务器       ss = new ServerSocket(8888);     } catch (BindException e) {       System.out.println("端口已在使用中");       // 关闭程序       System.exit(0);     } catch (Exception e) {       e.printStackTrace();     }     try {       isStart = true;       while (isStart) {         boolean isConnect = false;         // 启动监听         socket = ss.accept();         System.out.println("one client connect");         isConnect = true;         while (isConnect) {           // 获取客户端输入流           dataInputStream = new DataInputStream(               socket.getInputStream());           // 读取客户端传递的数据           String message = dataInputStream.readUTF();           System.out.println("客户端说:" + message);         }       }     } catch (EOFException e) {       System.out.println("client closed!");     } catch (Exception e) {       e.printStackTrace();     } finally {       // 关闭相关资源       try {         dataInputStream.close();         socket.close();       } catch (IOException e) {         e.printStackTrace();       }     }   } } 

以上所述是小编给大家介绍的Java Socket实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表