当前位置: 移动技术网 > IT编程>开发语言>Java > 基于Java Socket实现一个简易在线聊天功能(一)

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写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实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网