java聊天室的实现代码

本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下

聊天室界面:

源码:

public class ClientFrame extends Frame {

 private TextField textFieldContent = new TextField();
 private TextArea textAreaContent = new TextArea();
 private Socket socket = null;
 private OutputStream out = null;
 private DataOutputStream dos = null;
 private InputStream in = null;
 private DataInputStream dis = null;
 private boolean flag = false;

 /**
  * 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午9:19:51 功能:启动客户端程序
  *
  * @param args
  */
 public static void main(String[] args) {
  new ClientFrame().init();
 }

 /**
  * 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午9:20:43 功能:对窗口进行初始化
  */
 private void init() {
  this.setSize(300, 300);
  setLocation(250, 150);
  setVisible(true);
  setTitle("WeChatRoom");

  // 添加控件
  this.add(textAreaContent);
  this.add(textFieldContent, BorderLayout.SOUTH);
  textAreaContent.setFocusable(false);
  pack();

  // 关闭事件
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    System.out.println("用户试图关闭窗口");
    disconnect();
    System.exit(0);
   }

  });
  // textFieldContent添加回车事件
  textFieldContent.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    onClickEnter();
   }
  });

  // 建立连接
  connect();
  new Thread(new ReciveMessage()).start();
 }

 private class ReciveMessage implements Runnable {
  @Override
  public void run() {
   flag = true;
   try {
    while (flag) {
     String message = dis.readUTF();
     textAreaContent.append(message + "\n");
    }
   } catch (EOFException e) {
    flag = false;
    System.out.println("客户端已关闭");
    // e.printStackTrace();
   } catch (SocketException e) {
    flag = false;
    System.out.println("客户端已关闭");
    // e.printStackTrace();
   } catch (IOException e) {
    flag = false;
    System.out.println("接受消息失败");
    e.printStackTrace();
   }
  }

 }

 /**
  * 功能:当点击回车时出发的事件 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午9:49:30
  */
 private void onClickEnter() {
  String message = textFieldContent.getText().trim();
  if (message != null && !message.equals("")) {
   String time = new SimpleDateFormat("h:m:s").format(new Date());
   textAreaContent.append(time + "\n" + message + "\n");
   textFieldContent.setText("");
   sendMessageToServer(message);
  }
 }

 /**
  * 功能:给服务器发送消息 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午10:13:48
  *
  * @param message
  */
 private void sendMessageToServer(String message) {
  try {
   dos.writeUTF(message);
   dos.flush();
  } catch (IOException e) {
   System.out.println("发送消息失败");
   e.printStackTrace();
  }
 }

 /**
  * 功能:申请socket链接 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午10:00:38
  */
 private void connect() {
  try {
   socket = new Socket("localhost", 8888);
   out = socket.getOutputStream();
   dos = new DataOutputStream(out);
   in = socket.getInputStream();
   dis = new DataInputStream(in);
  } catch (UnknownHostException e) {
   System.out.println("申请链接失败");
   e.printStackTrace();
  } catch (IOException e) {
   System.out.println("申请链接失败");
   e.printStackTrace();
  }
 }

 /**
  * 功能:关闭流和链接 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午10:01:32
  */
 private void disconnect() {
  flag = false;
  if (dos != null) {
   try {
    dos.close();
   } catch (IOException e) {
    System.out.println("dos关闭失败");
    e.printStackTrace();
   }
  }
  if (out != null) {
   try {
    out.close();
   } catch (IOException e) {
    System.out.println("dos关闭失败");
    e.printStackTrace();
   }
  }
  if (socket != null) {
   try {
    socket.close();
   } catch (IOException e) {
    System.out.println("socket关闭失败");
    e.printStackTrace();
   }
   ;
  }
 }

}
package com.chat;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {

 private List<Client> clients = new ArrayList<>();

 /**
  * 功能:启动ChatSever 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午10:26:41
  *
  * @param args
  */
 public static void main(String[] args) {
  new ChatServer().init();
 }

 /**
  * 功能:对chatserver初始化 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午10:27:09
  */
 private void init() {
  System.out.println("服务器已开启");
  // BindException

  ServerSocket ss = null;
  Socket socket = null;
  try {
   ss = new ServerSocket(8888);
  } catch (BindException e) {
   System.out.println("端口已被占用");
   e.printStackTrace();
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  try {
   Client client = null;
   while (true) {
    socket = ss.accept();
    System.out.println("客户驾到");
    client = new Client(socket);
    clients.add(client);
    new Thread(client).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 private class Client implements Runnable {
  private Socket socket = null;
  InputStream in = null;
  DataInputStream din = null;
  OutputStream out = null;
  DataOutputStream dos = null;
  boolean flag = true;

  public Client(Socket socket) {
   this.socket = socket;
   try {
    in = socket.getInputStream();
    din = new DataInputStream(in);
   } catch (IOException e) {
    System.out.println("接受消息失败");
    e.printStackTrace();
   }

  }

  public void run() {

   String message;
   try {
    while (flag) {
     message = din.readUTF();
     // System.out.println("客户说:" + message);
     forwordToAllClients(message);
    }
   } catch (SocketException e) {
    flag = false;
    System.out.println("客户下线");
    clients.remove(this);
    // e.printStackTrace();
   } catch (EOFException e) {
    flag = false;
    System.out.println("客户下线");
    clients.remove(this);
    // e.printStackTrace();
   } catch (IOException e) {
    flag = false;
    System.out.println("接受消息失败");
    clients.remove(this);
    e.printStackTrace();
   }

   if (din != null) {
    try {
     din.close();
    } catch (IOException e) {
     System.out.println("din关闭失败");
     e.printStackTrace();
    }
   }
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     System.out.println("din关闭失败");
     e.printStackTrace();
    }
   }
   if (socket != null) {
    try {
     socket.close();
    } catch (IOException e) {
     System.out.println("din关闭失败");
     e.printStackTrace();
    }
   }

  }

  /**
   * 功能:转发给所有客户端 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午11:11:59
   *
   * @param message
   * @throws IOException
   */
  private void forwordToAllClients(String message) throws IOException {
   for (Client c : clients) {
    if (c != this) {
     out = c.socket.getOutputStream();
     dos = new DataOutputStream(out);
     forwordToClient(message);
    }
   }
  }

  /**
   * 功能:发送给一个客户端 学校:山东师范大学 程序员:外力_Victor 日期:2016年5月8日 上午11:16:12
   *
   * @throws IOException
   */
  private void forwordToClient(String message) throws IOException {
   dos.writeUTF(message);
   dos.flush();
   System.out.println("转发成功!");
  }

 }
}

源码下载:java聊天室代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现简单聊天室单人版

    本文实例为大家分享了java实现简单聊天室的具体代码,供大家参考,具体内容如下 先整理下思路: 1.创建一个通信服务端,传入端口号和相关的流后等待客户端连接,并初始化图形界面. 2.创建一个JFrame,用于写出聊天的界面,这里界面名称由其他类传入. 3.把客户端创建的方法写进JFrame(当然这里很粗糙的方法) 4.设置按钮的监听事件,发送消息和离线功能 首先创建一个服务端的类 import java.io.IOException; import java.net.ServerSocket;

  • 基于java编写局域网多人聊天室

    由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于C/S结构,即客户端服务器模式. 服务器: 默认ip为本机ip 需要双方确定一个端口号 可设置最大连接人数 可启动与关闭 界面显示在线用户人以及姓名(本机不在此显示) 客户端: 需要手动设置服务器ip地址(局域网) 手动设置端口号 输入姓名 可连

  • java socket实现聊天室 java实现多人聊天功能

    用java socket做一个聊天室,实现多人聊天的功能.看了极客学院的视频后跟着敲的.(1DAY) 服务端: 1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好 2. 实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket.启动线程后就把线程交给ChatManager管理 3. 在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端 4.

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

  • Java GUI编程实现在线聊天室

    引言 综合应用Java的GUI编程和网络编程,实现一个能够支持多组用户同时使用的聊天室软件.该聊天室具有比较友好的GUI界面,并使用C/S模式,支持多个用户同时使用,用户可以自己选择加入或者创建房间,和房间内的其他用户互发信息(文字和图片) 主要功能 客户端的功能主要包括如下的功能: 选择连上服务端 显示当前房间列表(包括房间号和房间名称) 选择房间进入 多个用户在线群聊 可以发送表情(用本地的,实际上发送只发送表情的代码) 退出房间 选择创建房间 房间里没人(房主退出),导致房间解散 显示系统

  • Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    相关阅读:Java Socket聊天室编程(二)之利用socket实现单聊聊天室 网上已经有很多利用socket实现聊天的例子了,但是我看过很多,多多少有一些问题存在. 这里我将实现一个比较完整的聊天例子,并解释其中的逻辑. 由于socket这一块比较大,所以我将分出几篇来写一个比较完整的socket例子. 这里我们先来实现一个最简单的,服务器与客户端通讯,实现消息推送的功能. 目的:服务器与客户端建立连接,客户端可以向服务器发送消息,服务器可以向客户端推送消息. 1,使用java建立socke

  • java编程实现多人聊天室功能

    本文实例为大家分享了java实现多人聊天室的具体代码,供大家参考,具体内容如下 程序源代码及运行截图: server.java //server.java package Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; impor

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • Java基于Tcp/ip连接的多人交互聊天室

    本文实例为大家分享了Java  Socket编程实现多人交互聊天室的具体代码,供大家参考,具体内容如下 本项目由三个.java文件(Client.java.Server.java.UI.java)和一个.jpg图片文件组成UI.java是负责界面的构成文件.本聊天室的界面极其简单.主要分为两个界面:第一个是启动时需要登陆的界面如下: 输入名字进去以后就可以直接聊天     这个聊天室相当于群聊,每一个登陆进去的人发的信息,其他人都会收到. 使用指南: 1.运行Server.java文件,保证服务

随机推荐