基于Socket的多线程聊天室

Linux下利用socket多线程实现简单网络聊天室 服务端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <pthread.h> #include <semaphore.h> #include <sys/socket.h> #include <netinet/in.h> #includ 阅读详情

使用Socket,并利用多线程,实现群聊通讯。

这里写图片描述

客户端和服务端都应该使用多线程,服务端多线程负责多个客户端的连接和信息转发,客户端的多线程负责每个客户端的信息接受与发送。

用一个list保存每个客户端的socket信息,服务端建立实例化对象读取所有的socket信息并进行通讯。

class allClient { //保存socket
    List list = new ArrayList();

    public void addList(Socket socket) {
        list.add(socket);
    }

    public void showList() {
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    public Socket getList(int n) {
        return (Socket) list.get(n);
    }

    public int getSize() {
        return list.size();
    }

}

服务端

/**
 * Created by hades on 2017/3/16.
 * 服务端
 */

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
    private int port = 8000;   //定义服务器连接端口
    private ServerSocket serverSocket;

    public EchoServer() throws IOException {
        serverSocket = new ServerSocket(port);  //新建serverSocket对象,绑定连接端口port
        System.out.println("服务器启动...");
    }

    public void service() throws IOException {
        Socket socket = null;
        try {
            int count = 0;
            while (true) {
                socket = serverSocket.accept();
                //创建一个新的线程
                ServerThread serverThread = new ServerThread(socket, count);
                //启动线程
                serverThread.start();
                System.out.println("客户端" + count + "已连接");
                System.out.println("套接字信息:" + socket);
                System.out.println("当前客户端的IP:" + socket.getInetAddress() + ":" + socket.getPort());
                count++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null)
                    socket.close();  //断开连接
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String args[]) throws IOException {
        new EchoServer().service();
    }
}

服务端多线程类

/**
 * Created by hades on 2017/3/17.
 * 服务端建立多线程实现多个客户端的连接
 */

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

class allClient { //保存socket
    List list = new ArrayList();

    public void addList(Socket socket) {
        list.add(socket);
    }

    public void showList() {
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    public Socket getList(int n) {
        return (Socket) list.get(n);
    }

    public int getSize() {
        return list.size();
    }

}

public class ServerThread extends Thread {
    Socket socket = null;
    int count = 0;
    Socket socket1 = null;
    private static allClient list = new allClient();

    public ServerThread(Socket socket, int count) {

        this.socket = socket;
        this.count = count;
        list.addList(socket);
        list.showList();
    }

    public String echo(String msg, int count) {

        return "客户端" + count + "说:" + msg;
    }

    private PrintWriter getWriter(Socket socket) throws IOException {  //输出流的建立
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {  //输入流的建立
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void run() {
        try {
            BufferedReader br = getReader(socket);

            String msg = null;
            while ((msg = br.readLine()) != null) {
                for (int i = 0; i < list.getSize(); i++) {
                    //System.out.println(getName());
                    socket1 = list.getList(i);
                    PrintWriter pw = getWriter(socket1);
                    pw.println(echo(msg, count));
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) socket.close();  //断开连接
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端

/**
 * Created by hades on 2017/3/16.
 * 客户端
 */

import java.io.*;
import java.net.Socket;

public class EchoClient {
    private String host = "localhost";
    private int port = 8000;
    private Socket socket;

    public EchoClient() throws IOException {
        socket = new Socket(host, port);   //建立socket对象,用于与服务器的通信,需要绑定服务器端口。
        //ClientThread clientThread=new ClientThread(socket);
        //clientThread.start();
        System.out.println("客户端套接字信息:" + socket);
    }

    private PrintWriter getWriter(Socket socket) throws IOException {  //输出流
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {  //输入流
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void talk() throws IOException {
        try {
            ClientThread clientThread = new ClientThread(socket);
            //启动线程
            clientThread.start();
            BufferedReader br = getReader(socket);
            PrintWriter pw = getWriter(socket);
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;
            while ((msg = localReader.readLine()) != null) {
                pw.println(msg);
                System.out.println(br.readLine());

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String args[]) throws IOException {
        new EchoClient().talk();
    }
}

客户端多线程类

/**
 * Created by hades on 2017/3/17.
 * 客户端多线程,实现每个客户端的信息接收
 */

import java.io.*;
import java.net.Socket;

public class ClientThread extends Thread {
    Socket socket = null;

    public ClientThread(Socket socket) {

        this.socket = socket;
    }

    public String echo(String msg) {

        return "返回的消息:" + msg;
    }

    private PrintWriter getWriter(Socket socket) throws IOException {  //输出流的建立
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {  //输入流的建立
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void run() {
        try {
            BufferedReader br = getReader(socket);
            //PrintWriter pw = getWriter(socket);

            String msg = null;
            while ((msg = br.readLine()) != null) {
                System.out.println(msg);
                //pw.println(echo(msg));
            }


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

    }
}
Java Socket+多线程 实现多人聊天室功能 思路简介 分为客户端和服务器两个类,所有的客户端将聊的内容发送给服务器,服务器接受后,将每一条内容发送给每一个客户端,客户端再显示在终端上。 客户端设计 客户端包含2个线程,1个用来接受服务器的信息,再显示,1个用来接收键盘的输入,发送给服务器。 import java.io.IOException; import java.io.InputStream; import java.io.... 阅读详情

相关推荐

Socket和多线程的聊天室

没有可视化窗口,基于控制台输入的的聊天室,使用socket套接字和多线程完成在线聊天功能,支持私聊和群聊,功能简单请见谅。

【一】【socket聊天室】-多线程,socket编程

(1)多用户聊天:一个服务器多个客户端,客户端信息显示在公共的服务端窗口,利用多线程实现; ——客户端双线程:一个接受线程一个发送线程(主线程); ——服务器单线程:接收线程; (2)多用户广播界面:将信息显示到所有用户界面和服务器界面,同时服务器也能发言,利用多线程实现; ——客户端双线程:一个接受线程一个发送线程(主线程); ——服务器单线程:一个接收线程(主线程)一个发送线程;其中接受线程为每个连接开了单独的线程;

杨的博客 7189

swing界面socket多线程聊天室

采用TCP协议开发的,swing做界面的java socket聊天室 支持群聊和私聊,发文件,以及用户登录注册等

Java综合应用实验-多人聊天室(多线程实现)

Java综合应用实验-多人聊天室(多线程实现) 1.实验目的: 编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是 “欢迎使用 XXX 聊天室应用”,其中 XXX 是自己的班级姓名学号,如“软件 171 张三 1234”。 2.实验代码: 服务端程序代码: ServerChar.java package works; import java.io.DataInputStream; import java.io.DataOutputStream; import java

CHANGE_A1的博客 9724

java socket多线程多人聊天室

多线程多人聊天室,在多线程的基础上建立其模块功能包括client,server,user

java利用Socket与多线程实现网络聊天室

服务端知识进行连接 之后调用服务端的线程 服务端并没有大的改动,在原有的基础上加上线程池, 客户端界面只有简单的传一个路径,不进行socket的链接, 调用客户端的方法,方法中有线程,线程中进行socket的链接,这样才能实现多个文件的传输。

多线程聊天室

项目名称 多线程聊天室 项目简介 多个用户可以在同一局域网下进行聊天. 类图: 项目执行流程 客户端通过对应端口号,和IP地址t与服务器端建立连接后,进行注册,然后通过输入输出流,进行通信。 服务器端收到信息后,进行解析,判断客户端的需求(私聊,群聊,下线等),从而进行相应的处理。 因为采取多线程的方式,服务器端,线程比较多,采取线程池的方式进行处理。每个客户端仅需要一个发送...

博客 2430

简单多线程socket聊天室程序(c语言)

server.c client.c Makefile 在linux下编译通过,C语言编写,短小精练。 server实现数据转发,使用了socket中的accept,select,线程中的线程分离属性(PTHREAD_CREATE_DETACHED)等 client实现读和写的异步,也使用了线程分离属性。 直接实现多个client终端对话。 可做为新人学习的参考。

[java聊天室]多个客户端与服务器说话&多线程(二)

多线程流程图,多线程API,多线程优先级,阻塞

YJH000_的博客 1157

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例)

本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。

weixin_30421809的博客 354

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

MFC聊天室实现多线程和SOCKET教程

MFC聊天室实现多线程和SOCKET教程 【下载地址】MFC聊天室实现多线程和SOCKET教程 本项目是一个基于MFC的图形聊天室示例,通过SOCKET编程和多线程技术,帮助开发者深入理解网络通信与多线程处理在图形界面中的应用。适合具备C++和MFC基础的开发者,通过实际操作掌握如何在MFC中使用SOCKET进行网络通信...

gitblog_06769的博客 475

基于POD和神经网络的多工况温度场重构反演系统

本文提出了一种基于本征正交分解(POD)和神经网络的多工况温度场重构反演系统。该系统通过POD方法从多工况温度场数据中提取主要特征模态,构建神经网络模型建立工况参数与POD模态系数的映射关系,实现温度场的快速重构。系统采用Python实现,包含数据预处理、POD分解、神经网络训练和温度场重构等模块。实验结果表明,该方法能够有效降低计算复杂度,实现高精度的温度场预测。

huanghm88的专栏 277

Java下基于Socket的多线程聊天室

刚刚完成了一个Java下基于Socket的多线程聊天室,与大家分享一下: 介绍一下我本地实现的软件详细信息以供参考: 操作系统:Microsoft Windows XP Professional SP3Java JDK:JDK1.6.0_02Eclipse :Eclipse-SDK-3.2-WIN32 服务器端:import java.io.*;import j

accpyy的专栏 1872

【毕设级教程】从0到1实现基于YOLOv8的UA-DETRAC交通目标检测系统(含UI界面,助力智能交通毕设)

本项目基于YOLOv8模型和UA-DETRAC数据集开发了一个交通目标检测系统,包含数据处理、模型训练和可视化界面全流程。UA-DETRAC数据集包含多种交通场景下的车辆标注,通过格式转换适配YOLOv8训练要求。系统采用PyQt开发交互界面,支持图像检测、结果显示等功能。该项目技术路线清晰,既展现深度学习在智能交通中的应用,又提供完整的可视化展示方案,适合作为计算机视觉相关毕业设计选题。

m0_64661770的博客 151

【华为OD机试】真题E卷-一种字符串压缩表示的解压(C++)

有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串aaabbccccd 经过压缩变成字符串 3abb4cd请您编写解压函数,根据输入的字符串, 判断其是否为合法压缩过的字符串若输入合法则输出解压缩后的字符串 否则输出字符串!error来报告错误。

u014481728的博客 894

java多线程聊天室_Java Socket 多线程聊天室

本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获的,毕竟讲真,想要把Java搞得有形有色的也是很不容易的,借助可视化的插件windowsBuilder,这个过程还是既exciting 又tiring的。好吧 ,然而图形界面已经成为了历史,现在来说说...

weixin_33178839的博客 352

从零玩转Vitis裸机开发:手把手教你创建、移植与实战优化

✅ Vitis裸机开发全流程✅ 中断系统配置技巧✅ 跨平台移植方法论✅ 性能优化实战经验研究FreeRTOS移植探索AMP(非对称多处理)架构学习使用Vitis Analyzer进行性能分析技术雷达:关注Xilinx最新推出的Vitis Unified IDE,其集成了更强大的调试和分析工具。立即动手实践吧!

QQ_778132974的博客 584

JAVA利用多线程和Socket制作GUI界面的在线聊天室

目录前言功能设计GUI画面展示服务器端客户端私聊窗口主要代码服务器端客户端其它代码打包成jar打包成exe文件如何让其它电脑访问聊天室?最后 前言 最近刚好是期末,碰上Java实训,借此将之前写的在线聊天室搬出来,加上GUI(Swing),当成实训作品,记录一下这次实训的结果。 本篇文章主要叙述的是 ① 在线聊天室的代码结构; ② 将java文件打包成jar,再打包成exe文件; ③ 利用内网穿透技术实现与他人在线聊天。 附:在线聊天室实用socket通信,利用的网络协议是TCP,架构为C/S模式(Cli

weixin_43853097的博客 5804

垂类大模型 研发方向与具体方案调研

领域知识库加上通用大模型,针对通用大模型见过的知识比较少的问题,利用向量数据库等方式根据问题在领域知识库中找到相关内容,再利用通用大模型强大的summarization和qa的能力生成回复,完成本次垂直大模型研发。目前很多企业希望将大模型的能力应用到企业内部当中,但很多通用大模型只是一个预训练模型,其所能回答的知识主要来源于互联网上公开的通用知识库,对于部分垂直领域和企业内部的私有知识库的问答,给出的回答。:垂类大模型的效果与底座性能息息相关,研发垂类大模型第一步就是确定开源大模型解决方案。

风吹落叶的博客 3329

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

perseverance51博客 8834

JAVA(多线程+socket)的简易聊天室程序

在用socket做服务端与客户端时,发现一个问题,当我们用whlie循环一次性在客户端或者服务端做一次性发送多条时,客户端或者服务端不能一次性全部接受,此时我们就要用到多线程。同时处理信息的接收与发送,两者互不干扰.。重点讲解一个服务类部分,客户端类变化不大

m0_49412847的博客 907

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Java】使用socket实现控制台多线程聊天室

刚学习了socket编程和多线程相关知识,为了巩固下知识,动手实现了一个基于BIO的socket+多线程的控制台聊天室。 github代码地址:传送门 功能介绍 首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。 client发送exit指令可以下线,所有的client端,以及server端都会收...

makersy的博客 1348

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java利用多线程写socket聊天室

事情是这样的,俺们这学期学java面向对象,实验课的网络通讯这块,让我们写一个基于Socket的聊天室,大家可以广播其他在线的用户,并发送数据,这里要求使用多线程写。话不多说,我们先看一下实验现象。 这是服务器端的现象 接下来我们说一下程序的大概思路, 服务器创建线程,并且线程在创建完毕之后一直使用socket = serverSocket.accept(...

韦海涛的博客 543

基于Java+socket实现多线程聊天室-控制台版

首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。client发送exit指令可以下线,所有的client端,以及server端都会收到它的下线通知。原理 socket 通信是基于TCP/IP 网络层上的一种传送方式。首先,服务端初始化ServerSocket,然后对指定的端口(这里是65000)进行绑定,接着对端口进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么

qq_33037637的博客 1213
上一篇: Button组实现文字颜色变化
下一篇: GirdLayout布局实现九宫格
Hades_Dev
博客等级 码龄14年 542粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值