java利用Socket实现聊天室功能实例

最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。

目录结构:

ChatClient:

package com.panda.chat; 

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*; 

@SuppressWarnings("serial")
public class ChatClient extends Frame {
 private TextArea ta = new TextArea();
 private TextField tf = new TextField();
 private DataOutputStream dos = null;
 private DataInputStream dis = null;
 private Socket socket = null;
 private boolean bConnected = false;
 private Thread thread=null;
 public static void main(String[] args) {
  new ChatClient().frameClient();
 }
 public void frameClient(){
  setSize(400, 400);
  setLocation(400,300);
  add(ta,BorderLayout.NORTH);
  add(tf,BorderLayout.SOUTH);
  pack();
  tf.addActionListener(new TfListener());
  //关闭窗口事件监听
  this.addWindowListener(new WindowAdapter() {
   @Override
   public void windowClosing(WindowEvent e) {
    disconnected();
    System.exit(0);
   }
  });
  this.connect();
  setVisible(true);
 }
 //链接服务器地址
 private void connect(){
  try {
   socket = new Socket("127.0.0.1", 8888);
   thread=new Thread(new ChatThread());
   thread.start();
   dos = new DataOutputStream(socket.getOutputStream());
   dis = new DataInputStream(socket.getInputStream());
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 //断开连接
 private void disconnected(){
  bConnected = false;
  try {
   dos.close();
   dis.close();
   socket.close();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
 }
 //键盘回车事件
 private class TfListener implements ActionListener{ 

  @Override
  public void actionPerformed(ActionEvent e) {
   String strMsg = tf.getText();
   tf.setText("");
   try {
    dos.writeUTF(strMsg);
    dos.flush();
   } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  } 

 }
 //开启线程接受服务器信息
 private class ChatThread implements Runnable{
  @Override
  public void run() {
   try {
    bConnected = true;
    while(bConnected){
     String msg = dis.readUTF();
     String taText = ta.getText();
     ta.setText(taText+msg+"\n");
    }
   } catch (SocketException e) {
    System.out.println("退出");;
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

ChatServer:

package com.panda.chat; 

import java.io.*;
import java.net.*;
import java.util.*; 

public class ChatServer {
 private boolean started = false;
 private List<ChatThread> chatThreads = new ArrayList<ChatThread>();
 public static void main(String[] args) {
  new ChatServer().startServer();
 }
 private void startServer(){
  try {
   //开启服务端Socket
   ServerSocket seso = new ServerSocket(8888);
   started = true;
   while(started){
    //接受客户端连接请求
    Socket sos = seso.accept();
    System.out.println("一个客户端已连接");
    //开启线程处理客户端通信
    ChatThread ct = new ChatThread(sos);
    chatThreads.add(ct);
    new Thread(ct).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 private class ChatThread implements Runnable{
  private Socket socket;
  private DataInputStream din=null;
  private DataOutputStream don=null;
  private boolean bConnected = false;
  public ChatThread(Socket socket) {
   super();
   this.socket = socket;
  }
  //发送信息的函数
  private void send(String strMsgIn){
   try{
    don.writeUTF(strMsgIn);
    don.flush();
   }catch(IOException e){
    e.printStackTrace();
   }
  }
  @Override
  public void run() {
   try{
    din = new DataInputStream(socket.getInputStream());
    don = new DataOutputStream(socket.getOutputStream());
    //读取数据
    bConnected = true;
    while(bConnected){
     String strMsgIn = din.readUTF();
     System.out.println(strMsgIn);
     //接收到数据后发送给每个客户端
     for(int i =0;i<chatThreads.size();i++){
      chatThreads.get(i).send(strMsgIn);
     }
    }
   }catch (IOException e) {
    try {
     //如果客户端出错或关闭,直接关闭连接,并移除List中的当前线程
     socket.close();
     chatThreads.remove(this);
    } catch (IOException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
   } finally{
    try {
     din.close();
     don.close();
     socket.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  } 

 }
}

运行ChatSever后,再同时打开多次ChatClient,就可以实现多人聊天了,你也试试。

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

(0)

相关推荐

  • 用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结构图:很简单,就1个类,1个页面 然后看具体代码 先看后端代码 package com.main; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.

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

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

  • JavaEE7+Websockets+GlassFish4打造聊天室

    在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的.在本系列教程中,将指导用户如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和Bootstrap.本文要求读者有一定的HTML 5 Websocket的基础原理知识. 效果图 我们先来看下在完成这个教程

  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大部分采用的都是"轮询"和"长连接"技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSoc

  • 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和WebSocket实现网页聊天室实例代码

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

  • Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    在上篇文章Java Socket聊天室编程(一)之利用socket实现聊天之消息推送中我们讲到如何使用socket让服务器和客户端之间传递消息,达到推送消息的目的,接下来我将写出如何让服务器建立客户端与客户端之间的通讯. 其实就是建立一个一对一的聊天通讯. 与上一篇实现消息推送的代码有些不同,在它上面加以修改的. 如果没有提到的方法或者类则和上一篇一模一样. 1,修改实体类(服务器端和客户端的实体类是一样的) 1,UserInfoBean 用户信息表 public class UserInfoB

  • java利用Socket实现聊天室功能实例

    最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.panda.chat; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; @SuppressWarnings("serial") public class ChatClient extend

  • Java NIO实战之聊天室功能详解

    本文实例讲述了Java NIO实战之聊天室功能.分享给大家供大家参考,具体如下: 在工作之余花了两个星期看完了<Java NIO>,总体来说这本书把NIO写的很详细,没有过多的废话,讲的都是重点,只是翻译的中文版看的确实吃力,英文水平太低也没办法,总算也坚持看完了.<Java NIO>这本书的重点在于第四章讲解的"选择器",要理解透还是要反复琢磨推敲:愚钝的我花了大概3天的时间才将NIO的选择器机制理解透并能较熟练的运用,于是便写了这个聊天室程序. 下面直接上代

  • JAVA NIO实现简单聊天室功能

    本文实例为大家分享了JAVA NIO实现简单聊天室功能的具体代码,供大家参考,具体内容如下 服务端 初始化一个ServerSocketChannel,绑定端口,然后使用Selector监听accept事件. 当有accept发生时,表示有客户端连接进来了,获取客户端的SocketChannel,然后注册其read事件:用来接收客户端发送的消息. package chatroom; import java.io.IOException; import java.net.InetSocketAddr

  • Java基于NIO实现聊天室功能

    本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 Sever端 package com.qst.one; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.channels.Channel; import java.nio.channels.SelectableChannel; impor

  • Java Socket实现聊天室功能

    本文实例为大家分享了Java Socket实现聊天室的具体代码,供大家参考,具体内容如下 1 创建登录判断类UserLogin import java.util.HashSet; import java.util.Set; public class UserLogin {     public static boolean login(String username) {         Set<String> set = initUser();         // set中含有该usern

  • Java实现简单的聊天室功能

    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一.客户端的创建 1.我们可以用Socket来创建客户端 /**   *@类名 Client   *@描述 TODO 客户端 1   *@版本 1.0   *@创建人 XuKang   *@创建时间 2020/9/24 16:18   **/ public class Client {     public static void main(String[] args) throws UnknownHostExc

  • unity使用socket实现聊天室功能

    本文实例为大家分享了unity使用socket实现聊天室的具体代码,供大家参考,具体内容如下 unity聊天室服务端实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; namespace 服务端_03 { class Prog

  • java仿QQ微信聊天室功能的实现

    话不多说,先上图                                   即时通信系统:可以完成群聊.私人聊天,实时发送和显示聊天信息,完成好友列表,进一步可以带表情,附件发送,聊天信息的传送,等 系统的主要技术socket通信技术,多线程技术,数据库技术. 本系统实现的功能有:1.用户名字登录 2.用户之间的群聊和查看群聊记录3.用户之间的私聊和私聊记录4.动态刷新并显示好友列表5.显示在线人数 6.服务器可以显示用户在线状态 7.能够退出处理. 该程序可以实现局域网的聊天,只要把

  • Java用局域网实现聊天室功能

    本文实例为大家分享了Java用局域网实现聊天室的具体代码,供大家参考,具体内容如下 类和接口 Server类(服务器端) package Test; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server {     private static final int SERVER_PORT=30

  • 用PHP+MySQL搭建聊天室功能实例代码

    下面,以一个简单的聊天室设计为例,介绍PHP+MySQL在网页开发中的应用 1.总体设计 1.1 构思与规划: 聊天室的基本原理,就是把每个连上同一网页的用户传送的发言数据储存起来,然后将所有的发言数据传给每一用户.也就是说,用数据库汇集每个人的发言,并将数据库中的数据传给每一个人就实现了聊天室的功能. 1.2 表设计 首先使用MySQL建立表chat用来储存用户的发言: 复制代码 代码如下: mysql> CREATE TABLE chat -> (chtime DATATIME, ->

随机推荐