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

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

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实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
socket实现聊天
java socket实现聊天、java实现简易聊天软件、socket实现简易服务器、websocket实现聊天室、socket实现聊天室,以便于您获取更多的相关知识。

时间: 2024-10-03 09:00:22

基于Java Socket实现一个简易在线聊天功能(一)_java的相关文章

基于Java Socket的自定义协议,实现Android与服务器的长连接(一)

一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解更加顺畅. 1. 网络七层协议 OSI的7层从上到下分别是:7 应用层. 6 表示层. 5 会话层. 4 传输层. 3 网络层. 2 数据链路层. 1 物理层;其中高层(即7.6.5.4层)定义了应用程序的功能,下面3层(即3.2.1层)主要面向通过网络的端到端的数据流.应用层常见的协议有:HTTP

想开发一个类似人人网右下角的在线聊天功能??

问题描述 我想开发一个类似人人网右下角的在线聊天功能,主要功能有31.可以实时显示在线好友(不想要定时刷新数据库的方式,因为占资源太大,当然Ajax是必需的)2.加好友并分组3.在线聊天请问各位有没有代码或参考资料-多谢 解决方案 解决方案二:顶一下!解决方案三:没有做过.帮顶解决方案四:没有做过.帮顶解决方案五:我觉得AJAX估计不行,可以用flex,silverlight等,当然这些插件表现出来很小,用户注意不到,然后利用这些插件做跳板,利用其socket通信,这样才会很及时.javascr

Java Socket+mysql实现简易文件上传器的代码_java

最近跟着某网站学习了一个小项目,因为白天有课,所以都是晚上写的,今天把它完成了. 项目主要是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的). 首先建两个表如下: 一个文件信息表 CREATE TABLE `fileinfo` ( `Fname` char(50) NOT NULL, `FInfo` blob NOT NULL, `FId` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`FId`) ) ENGINE=I

java代码-我用java写了一个简易计算器的程序,但是有时候结果不正确

问题描述 我用java写了一个简易计算器的程序,但是有时候结果不正确 就是有时候计算结果后面会显示很多9或者0 ,比如计算8.3-2.1时,请问大神怎么解决啊? 我是菜菜鸟,程序如下: //Calculator.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame { private JPanel p1=new JPanel();

腾讯微博新增在线聊天功能

腾讯微博新增了在线http://www.aliyun.com/zixun/aggregation/10032.html">聊天功能,发起聊天的范围仅限微博中相互收听的用户(好友),我输入"徐静蕾"然后它提示我"无法发起聊天".在微博上有很多人看到MM.靓仔都会想要求交往.求合体,其中最重要的一个媒介就是IM工具,腾讯微博的聊天功能在保护QQ用户隐私的同时提供基于微博的一种新沟通方式. 在这个新工具中,你可以设置自己的聊天状态,联系人列表会显示你最近聊

网页实现在线聊天功能

问题描述 怎样用ASP.NET实现在线聊天功能 解决方案 解决方案二:(个人观点)在页面加一个GirdView控件或者ListView控件作为显示聊天信息,在加一个ListBox控件,用来输入信息的(附带表情要另作考虑),加一个确定按钮,输入信息时,点击确定按钮,数据插入到数据库中,并调用显示信息的方法,就能实现那种聊天的效果,同时页面最好加一个无闪烁刷新,这样才能同步,从而达到那种聊天效果.解决方案三:这个可以去看看,做的简单点可以ajax不停的轮询,就是服务器会吃不消 -----------

thinkphp 实现在线聊天功能的例子

你想为你的博客或者网站添加的在线聊天功能,为你的用户提供技术支持,或者不仅仅是客服功能,让你的用户能够相互交流,增强网站或者博客互动功能,这里为大家介绍1个为博客或者网站打造的聊天工具,只要您懂得thinkphp就能看得懂此段代码.主要实现的方法是thinkphp+ajax,不在赘述直接贴出代码: 数据库结构: think_msg 表用来存储聊天记录 DROP TABLE IF EXISTS `think_msg`; CREATE TABLE IF NOT EXISTS `think_msg`

基于javascript、ajax、memcache和PHP实现的简易在线聊天室_javascript技巧

在线聊天室(online chatrooms)是一个共多人进行沟通交流的网络平台,随着越来越多的新技术的发明和成熟运用,在线聊天室也出现使用各种不同技术的, 这篇文章我想简单总结一下. 首先说一下前台技术,最新的当然是基于HTML5的websocket,它实现了浏览器与服务器全双工通信(full-duplex).WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准.在WebSocket API中,浏览器和服务器只需要做一个握手的动作

基于Java回顾之多线程同步的使用详解_java

首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索. 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对"单对象多线程"的情况进行讨论,一般会将其分成两部分,一部分是关于"共享变量",一部分关于"执行步骤". 共享变量 当我们在线程对象(Run