java实现多客户聊天功能

java 实现多客户端聊天(TCP),供大家参考,具体内容如下

1. 编程思想:

1)、要想实现多客户端聊天,首先需要有多个客户端,而这些客户端需要随时发送消息和接受消息,所以收发消息需要放入不同的线程中。

2)、多客户聊天并不是多个客户之间进行两两通信,而是需要所有客户端与服务端进行交互,再由服务端统一下发信息到其他参与聊天的客户端。

2. 代码实现:

2.1 实现专用于接收消息的子线程ReceiveThread

将接收消息和发送消息分为两个线程,其中将发送消息写入主线程中,开启新的线程用于接收消息。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReceiveThread extends Thread{

 private Socket socket; //私有的成员变量,套接字

 public ReceiveThread(Socket socket) {
  this.socket = socket;
 }

 @Override
 public void run() {
  BufferedReader br = null;//使用带缓冲区的字符输入流接收信息
  try {
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {
   e.printStackTrace();
  }
  while(true){
   try {
    System.out.println(br.readLine());
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

2.2 客户端代码

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
 @SuppressWarnings("all")
 public static void main(String[] args) throws UnknownHostException, IOException {
        //ip:需要连接的服务端所在的ip
        //端口:客户端连接的端口必须和服务端端口一致
  Socket socket = new Socket("192.168.*.*",8080);
  Scanner scan = new Scanner(System.in);
  new ReceiveThread(socket).start();
  //发送给服务端信息
  while(true ){
   PrintStream ps = new PrintStream(socket.getOutputStream());
   ps.println("一号:"+scan.next());
  }
 }
}

注:

1)、客户端代码可以在局域网下的多台电脑上运行,只需要将ip地址改为服务端的ip,就能够连接。

2)、如果想要使用同台电脑完成一个服务端和两个客户端运行,进行测试多人聊天,可创建客户端2,使用本机ip

Socket socket = new Socket("127.0.0.1",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
//发送给服务端信息
while(true ){
    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("二号:"+scan.next());
}

2.3 服务端接收和转发信息的线程ServerThread

服务端在每一个客户端进行连接时,都会产生一个线程,用于服务这个客户,负责接收该客户发送的信息,并转发到参与多人聊天的其他客户。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.Set;

public class ServerThread  extends Thread{

 private Socket socket;

 public ServerThread(Socket socket) {
  this.socket = socket;
 }
 @Override
 public void run() {
  BufferedReader br = null;
  String str=null;
  try {
   br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {
   e.printStackTrace();
  }
  while(true){
   try {
    str=br.readLine();
                //在服务端输出,可以监测到所有人的聊天信息。
    System.out.println(str);

    //发送到其他客户端
    Set<Entry<InetAddress, Socket>> entrySet = Server.map.entrySet();
    for (Entry<InetAddress, Socket> entry : entrySet) {
     InetAddress key = entry.getKey();
     Socket value = entry.getValue();
     if(socket.getInetAddress()!=key){
      PrintStream printStream = new PrintStream(value.getOutputStream());
      printStream.println(str);
     }
    }

   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

2.4 服务端代码

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;

public class Server {
 @SuppressWarnings("all")

 public static ConcurrentHashMap<InetAddress, Socket> map =new ConcurrentHashMap<>();
 public static void main(String[] args) throws IOException, InterruptedException {

  //创建服务端的ServerSocket
  ServerSocket server = new ServerSocket(8080);
  while(true){
            //接收到客户连接就创建一个对应的套接字
   Socket socket = server.accept();
            //获取该客户的ip
   InetAddress inetAddress = socket.getInetAddress();
   //将该客户的ip和套接字装入map集合
   map.put(inetAddress, socket);
            //创建新的线程服务该客户
   new ServerThread(socket).start();
  }
 }
}

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

(0)

相关推荐

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

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

  • java实现自动回复聊天机器人

    本文实例为大家分享了java实现自动回复聊天机器人的具体代码,供大家参考,具体内容如下 聊天机器人 调用网上现有的接口,然后解析数据 以上是演示图片 源码下载地址 基本工作流程就是,调用API,解析返回的数据 HttpUtil类,调用API,获取返回的数据 package com; import com.sun.org.apache.bcel.internal.generic.INSTANCEOF; import java.io.BufferedReader; import java.io.In

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

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到我们平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首

  • 网页版在线聊天java Socket实现

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

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

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

  • 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中UDP简单聊天程序实例代码

    学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信.TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议. java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠! 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地. (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容. 客户机 复制代码 代码如下: package com

  • 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聊天室的实现代码

    本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下 聊天室界面: 源码: public class ClientFrame extends Frame { private TextField textFieldContent = new TextField(); private TextArea textAreaContent = new TextArea(); private Socket socket = null; private OutputStream out

随机推荐