加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

网页版在线聊天java Socket实现

发布时间:2020-05-23 22:22:28 所属栏目:Java 来源:互联网
导读:本文为大家分享了一个满足在线网页交流需求的实例,由于javaSocket实现的网页版在线聊天功能,供大家参考,具体内容如下

本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下

实现步骤:
1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;
2、结合线程,实现多客户端连接服务端发送消息;
3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;
4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现。

这里首先实现第一步的简单功能,难点在于:
1、没有用过awt组件,没有用过java相关的监听事件;
2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。

实现功能的代码:
在线聊天客户端:
1、生成图形窗口界面轮廓
2、为轮廓添加关闭事件
3、在轮廓中加入输入区域和内容展示区域
4、为输入区域添加回车事件
5、建立服务端连接并发送数据

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(); 
      } 
    } 
  } 
} 

继续,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程。每当有一个新的客户端连接上来,服务端便需要新启动一个线程进行处理,从而解决之前的循环读取中造成阻塞的问题。

写线程通常有两种方法,集成Thread或者实现runnable接口,原则上是能实现runnable的情况下就不继承,因为实现接口的方式更加灵活。

客户端代码相较之前没有变化,变得是服务端,因此这里便只贴出服务端代码:

java使用socket和awt组件以及多线程简单实现在线聊天功能服务端 :

实现多个客户端连接后不断向服务端发送消息, 相对于第一个版本,重点在于使用了多线程。服务端还未实现转发功能,客户端图形窗口中只能看到自己输入的信息,不能看到其他客户端发送的消息。

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; 
import java.net.SocketException; 
 
/** 
 * * 
 * @author tuzongxun123 
 * 
 */ 
public class ChatServer { 
 
  public static void main(String[] args) { 
    new ChatServer().start(); 
  } 
 
  // 是否成功启动服务端 
  private boolean isStart = false; 
  // 服务端socket 
  private ServerSocket ss = null; 
  // 客户端socket 
  private Socket socket = null; 
 
  public void start() { 
    try { 
      // 启动服务器 
      ss = new ServerSocket(8888); 
    } catch (BindException e) { 
      System.out.println("端口已在使用中"); 
      // 关闭程序 
      System.exit(0); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
 
    try { 
      isStart = true; 
      while (isStart) { 
        // 启动监听 
        socket = ss.accept(); 
        System.out.println("one client connect"); 
        // 启动客户端线程 
        Client client = new Client(socket); 
        new Thread(client).start(); 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally { 
      // 关闭服务 
      try { 
        ss.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
 
  } 
 
  /** 
   * 客户端线程 
   * 
   * @author tuzongxun123 
   * 
   */ 
  class Client implements Runnable { 
    // 客户端socket 
    private Socket socket = null; 
    // 客户端输入流 
    private DataInputStream dataInputStream = null; 
    private boolean isConnect = false; 
 
    public Client(Socket socket) { 
      this.socket = socket; 
      try { 
        isConnect = true; 
        // 获取客户端输入流 
        dataInputStream = new DataInputStream(socket.getInputStream()); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
 
    @Override 
    public void run() { 
      isConnect = true; 
      try { 
        while (isConnect) { 
          // 读取客户端传递的数据 
          String message = dataInputStream.readUTF(); 
          System.out.println("客户端说:" + message); 
        } 
      } catch (EOFException e) { 
        System.out.println("client closed!"); 
      } catch (SocketException e) { 
        System.out.println("Client is Closed!!!!"); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } finally { 
        // 关闭相关资源 
        try { 
          dataInputStream.close(); 
          socket.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
 
  } 
 
} 

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读