广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java通过Socket实现简单多人聊天室
  • 786
分享到

Java通过Socket实现简单多人聊天室

2024-04-02 19:04:59 786人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java通过Socket实现多人聊天室的具体代码,供大家参考,具体内容如下 Socket可以实现网络上两个程序通过双向通道进行数据的交换,此外它是Java中网络t

本文实例为大家分享了Java通过Socket实现多人聊天室的具体代码,供大家参考,具体内容如下

Socket可以实现网络上两个程序通过双向通道进行数据的交换,此外它是Java中网络tcp/IP协议的封装,例如可以进行网络通信等等,下面我们就来简单写一下多人聊天室。

首先来分析一下要实现的流程

  • 首先建立一个服务器端,构建ServerSocket并绑定端口
  • 创建socket客户端,连接到指定ip以及其端口
  • 然后使用accept阻塞接收socket发出的连接请求
  • 获取连接后的socket客户端的输入流和输出流
  • 根据输入流和输出流进行两者数据的通信

值得一提是:该Socket是同步阻塞的,因此在socket客户端需要进行创建一个线程,来分别进行向服务器输出,和接收服务器传输的数据。要解决同步阻塞这个问题可以去了解JAVA NIO

Socket客户端代码如下:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
public class Client{
 
 public static void main(String[] args) throws IOException {
 //创建连接指定Ip和端口的socket
 Socket socket = new Socket("127.0.0.1",5200);
 //获取系统标准输入流
 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 PrintWriter out = new PrintWriter(socket.getOutputStream());
 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 //创建一个线程用于读取服务器的信息
 new Thread(new Runnable() {
  @Override
  public void run() {
  try {
   while (true){
   System.out.println(in.readLine());
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }).start();
 //写信息给客户端
 String line = reader.readLine();
 while (!"end".equalsIgnoreCase(line)){
  //将从键盘获取的信息给到服务器
  out.println(line);
  out.flush();
  //显示输入的信息
  line = reader.readLine();
 }
 out.close();
 in.close();
 socket.close();
 
 }
}

由于要接收多个客户端的请求,因此服务端需要多个线程进行分别来接收客户端的请求。

Socket服务端代码如下:


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.Vector;
 
public class Servers {
 //将接收到的socket变成一个集合
 protected static List<Socket> sockets = new Vector<>();
 
 public static void main(String[] args) throws IOException {
 //创建服务端
 ServerSocket server = new ServerSocket(5200);
 boolean flag = true;
 //接受客户端请求
 while (flag){
  try {
  //阻塞等待客户端的连接
  Socket accept = server.accept();
  synchronized (sockets){
  sockets.add(accept);
  }
  //多个服务器线程进行对客户端的响应
  Thread thread = new Thread(new ServerThead(accept));
  thread.start();
  //捕获异常。
  }catch (Exception e){
  flag = false;
  e.printStackTrace();
  }
 }
 //关闭服务器
 server.close();
 }
 
}

Server线程代码如下:


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

public class ServerThead extends Servers implements Runnable{
 
 Socket socket;
 String socketName;
 
 public ServerThead(Socket socket){
 this.socket = socket;
 }
 @Override
 public void run() {
 try {
  BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  //设置该客户端的端点地址
  socketName = socket.getRemoteSocketAddress().toString();
  System.out.println("Client@"+socketName+"已加入聊天");
  print("Client@"+socketName+"已加入聊天");
  boolean flag = true;
  while (flag)
  {
  //阻塞,等待该客户端的输出流
  String line = reader.readLine();
  //若客户端退出,则退出连接。
  if (line == null){
   flag = false;
   continue;
  }
  String msg = "Client@"+socketName+":"+line;
  System.out.println(msg);
  //向在线客户端输出信息
  print(msg);
  }
 
  closeConnect();
 } catch (IOException e) {
  try {
  closeConnect();
  } catch (IOException e1) {
  e1.printStackTrace();
  }
 }
 }
 
 private void print(String msg) throws IOException {
 PrintWriter out = null;
 synchronized (sockets){
 for (Socket sc : sockets){
  out = new PrintWriter(sc.getOutputStream());
  out.println(msg);
  out.flush();
 }
 }
 }
 
 public void closeConnect() throws IOException {
 System.out.println("Client@"+socketName+"已退出聊天");
 print("Client@"+socketName+"已退出聊天");
 //移除没连接上的客户端
 synchronized (sockets){
  sockets.remove(socket);
 }
 socket.close();
 }
}

由于要接收多个客户端的信息,并转发到每一个已经连接上的客户端,因此创建了一个Vector集合来保存每一个客户端Socket,由于是多个线程同时对这个Vector集合进行操作,因此加上synchronized关键字保证同步安全

先运行服务器端,然后在运行多个客户端就可以进行多人聊天了。

下面是运行的结果。

 

客户端2

 

客户端1

 

客户端3

服务端

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

--结束END--

本文标题: Java通过Socket实现简单多人聊天室

本文链接: https://www.lsjlt.com/news/123027.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java通过Socket实现简单多人聊天室
    本文实例为大家分享了Java通过Socket实现多人聊天室的具体代码,供大家参考,具体内容如下 Socket可以实现网络上两个程序通过双向通道进行数据的交换,此外它是Java中网络T...
    99+
    2022-11-12
  • Java基于Socket实现多人聊天室
    本文实例为大家分享了Java基于Socket实现简易版多人聊天室的具体代码,供大家参考,具体内容如下 一、 聊天室需求 1、一个服务端,多个客户端;2、实现客户端和服务端的交互;3、...
    99+
    2022-11-13
  • Java Socket实现简易聊天室
    Java-Socket编程实现简易聊天室(TCP),供大家参考,具体内容如下 实现一个服务器接收多个客户端 测试: 首先启动服务器,然后启动三个客户端,输入三个不同的用户名,分别在聊...
    99+
    2022-11-11
  • python简单的多人聊天室
    刚开始学习python,写了一个聊天室练练手。 Server.py import socket,select,thread; host=socket.gethostname() port=5963 addr=(host,port) ...
    99+
    2023-01-31
    聊天室 简单 python
  • Java Socket+多线程实现多人聊天室功能
    本文实例为大家分享了Java Socket+多线程实现多人聊天室的具体代码,供大家参考,具体内容如下 思路简介 分为客户端和服务器两个类,所有的客户端将聊的内容发送给服务器,服务器接...
    99+
    2022-11-12
  • C#实现简易多人聊天室
    本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下 只有一个群聊的功能 服务端 using System; using System.Collectio...
    99+
    2022-11-13
  • Java Socket怎样实现简易聊天室
    这篇文章主要介绍了Java Socket怎样实现简易聊天室,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java-Socket编程实现简易聊天室(TCP),具体内容如下实现一...
    99+
    2023-06-14
  • 怎么使用Java socket通信模拟QQ实现多人聊天室
    这篇文章主要介绍“怎么使用Java socket通信模拟QQ实现多人聊天室”,在日常操作中,相信很多人在怎么使用Java socket通信模拟QQ实现多人聊天室问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-02
  • Java NIO实现多人聊天室
    本文实例为大家分享了Java NIO实现多人聊天室的具体代码,供大家参考,具体内容如下 1. 服务器端代码 ChatServer类: package nio.test.serve...
    99+
    2022-11-12
  • C#使用Socket实现本地多人聊天室
    本文实例为大家分享了C#使用Socket实现本地多人聊天室的具体代码,供大家参考,具体内容如下 【脚本一:Server端】 使用本机地址:127.0.0.1 完整代码 using S...
    99+
    2022-11-13
  • java+socket实现简易局域网聊天室
    本文实例为大家分享了java+socket实现简易局域网聊天室的具体代码,供大家参考,具体内容如下 服务器端 ServerFrame.java package com.eze.cha...
    99+
    2022-11-13
  • C#基于Socket实现简单聊天室功能
    因为这段时间在学习Socket,所以就试着写了一个简单的聊天室。主要分为服务器端和多个客户端。利用服务器端作数据中转站,实现消息群发。 1、服务器端有两个类: using Syste...
    99+
    2022-11-13
  • 怎么用Java Socket+多线程实现多人聊天室功能
    这篇文章主要讲解了“怎么用Java Socket+多线程实现多人聊天室功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java Socket+多线程实现多人聊天室功能”吧!思路简介分...
    99+
    2023-06-20
  • Java编写实现多人聊天室
    本文实例为大家分享了Java实现多人聊天室的具体代码,供大家参考,具体内容如下 1.客户端 package tk.javazhangwei.net.tcp.chat.Demo03; ...
    99+
    2022-11-13
  • java实现多人聊天对话室
    使用ServerSocket和Socket实现服务器端和客户端的Socket通信。 了解完socket通信步骤后可以发现本实验需要写两个类:Server和Client,并且要先运行...
    99+
    2022-11-12
  • Node.js+express+socket实现在线实时多人聊天室
    本文实例为大家分享了Node.js+express+socket实现在线实时多人聊天室的具体代码,供大家参考,具体内容如下 文件结构如下: 前端部分: 登录页面Login部分: l...
    99+
    2022-11-12
  • C++实现多人聊天室
    本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下 UDP 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点。 //...
    99+
    2022-11-12
  • Java Socket模拟实现聊天室
    使用Java Socket模拟实现了一个聊天室,实现了基本的私聊以及群聊。分为服务器端和客户端,下面我来介绍一下实现的步骤。 服务器端 服务器端是聊天室的核心所在,主要用来处理客户端...
    99+
    2022-11-12
  • Java Socket实现聊天室功能
    本文实例为大家分享了Java Socket实现聊天室的具体代码,供大家参考,具体内容如下 1 创建登录判断类UserLogin import java.util.HashSet; i...
    99+
    2022-11-13
  • Java Socket实现多人聊天系统
    本文实例为大家分享了Java Socket实现多人聊天系统的具体代码,供大家参考,具体内容如下 前言 GitHub地址 开发环境:Eclipse Java 2019-06 注意:本项...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作