Soket 聊天室

Android socket聊天室 效果图:利用socket实现了简单的聊天室功能。首先要用java先写一个ServerSocket服务器public class SocketTest { public static void main(String[] args) { try { //端口号从1-65535中任选一个,一般选择较大的 ServerSocket se 阅读详情

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;//无法确定主机IP地址时抛出异常
import java.util.Scanner;
/**
 * 聊天室客户端
 *
 */
public class TCPClient {
    /*
     * java.net.Socket
     * 封装了TCP通讯协议,使用它与远程计算机进行网络通讯
     */
    private Socket socket;//实现客户端套接字,实际工作是由Socketlmpl类的一个实例执行的
    /**
     * 构造方法,用来初始化客户端
     * @throws IOException
     * @throws UnknownHostException
     */
    public TCPClient() throws UnknownHostException, IOException{
        /*
         * 实例化Socket是需要传入两个参数
         * 1:服务端IP地址
         * 2:服务端端口(0~65535)
         * 通过IP地址可以找到网络上的服务端所在的计算机
         * 通过端口可以连接到该计算机上的服务端应用程序
         * 实例化Socket的过程就是建立连接的过程,所以若连接服务端失败,这里会抛出异常。
         */
        System.out.println("正在与服务端建立连接...");
        socket = new Socket("localhost",8088);//创建一个流套接字,并将其连接到localhost上的8088端口。
        System.out.println("与服务端连接成功");
    }
    /**
     * 客户端的启动方法,从这里开始执行客户端逻辑
     */
    public void start() {
        try {
            Scanner sc = new Scanner(System.in);
            OutputStream out = socket.getOutputStream();//返回此套接字的输出流给out,OutputStream将操作委托给通道套接字
            OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");//从字符流out中写入多个字符转换成的字节流到osw,使用指定的名称为UTF-8的字符集,也可以使用平台默认的字符集
            PrintWriter pw = new PrintWriter(osw,true);//将osw字节流格式化表示输出到文本输出流pw
            ServerHandler handler = new ServerHandler();//接收客户端消息输出到客户端控制台的线程
            Thread t = new Thread(handler);//创建新的线程
            t.start();//启动读取服务端发送过来消息的线程
            System.out.println("开始聊天吧!");
            String line = null;
            while(true){
                line = sc.nextLine();//此方法返回当前行的其余部分,不包括末尾的任何行解析器。位置设置为下一行的开头。
                System.out.println("你说:"+line);
                pw.println(line);//文本输出
            }
        } catch (Exception e) {

         }
    }
    public static void main(String[] args) {
        try {
            TCPClient client = new TCPClient();//使用初始化的TCPClient()方法
            client.start();//客户端启用方法
            
        } catch (Exception e) {
            e.printStackTrace();//错误回溯
            System.out.println("客户端启动失败!");
        }
    }
    /**
     * 该线程用来循环接收服务端发送过来的消息并输出到客户端自己的控制台上
     */
    private class ServerHandler implements Runnable{
        public void run() {
            try {
                InputStream in = socket.getInputStream();//返回套接字输入字节流给in,InputStream将操作委托给通道套接字
                InputStreamReader isr = new InputStreamReader(in,"UTF-8");//从字节流in中读取多个字节转换为字符流到isr,使用指定的名称为UTF-8的字符集,也可以使用平台默认的字符集
                BufferedReader br = new BufferedReader(isr);//从字符输入流isr中读取文本到br,缓冲字符提供对字符、数组、和行的有效读取。
                String message = null;
                while((message = br.readLine())!=null){//从字符文本集中获取消息文本
                    System.out.println("[服务端]说:"+message);
                }
            } catch (Exception e) {
            }
        }
    }
}

服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 *
 聊天室服务端
 *
 */
public class TCPServer {
    /*
     * java.net.ServerSocket
      *  运行在服务端的ServerSocket主要有两个作用
     * 1:申请服务端口
     * 2:监听服务端口,一旦一个客户端通过该端口建立连接,则创建一个Socket用于与该客户端通讯
     */
    private ServerSocket server;//ServerSocket类实现服务器套接字
    //private ServerSocket server2;
    /*
     * 该集合用来存放所有客户端的输出流,用于将消息广播给所有客户端
     */
    private List<PrintWriter> allOut;//创建列表
    public TCPServer() throws IOException{
        /*
         * 初始化ServerSocket的同时需要指定服务端口
         * 该端口号不能与系统其它应用程序已申请的端口号重复,否则会抛出异常。
         */
        server = new ServerSocket(8088);//创建一个服务器套接字,绑定到8088端口。端口号为0时表示端口号是自动分配的
        //server = new ServerSocket(8089);
        allOut = new ArrayList<PrintWriter>();//构造初始容量为10的PrintWriter文本输出流空列表
        
    }
    public void start(){
        Socket socket=null;
        try {
            /*
             * ServerSocket提供方法:
             * Socket accept()
             * 该方法会监听ServerSocket申请的服务端口。 这是一个阻塞方法,直到一个客户端通过该端口连接, 才会返回一个Socket。这个返回的Socket是用于与连接的客户端进行通讯的
             */
            while(true){                
            System.out.println("等待客户端连接...");
            socket = server.accept();//监听到这个套接字的连接并接受。该方法将阻塞,直到建立连接为止。
            System.out.println("一个客户端连接了!");
            /*
             * 启动一个线程 与该客户端交互
             */
            Thread t = new Thread(new ClientHandler(socket));//定义一个线程t执行类ClientHandler定义的不含参数的run实例与指定socket的客户端互交
            t.start();
            }    
        } catch (Exception e) {
            e.printStackTrace();
            try {
                socket.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 将给定的消息广播给所有客户端
     *
     */
    private void sendMessage(String message){
        synchronized(allOut){                        
            //列表同步,转发给所有客户端
            for(PrintWriter o: allOut){//对列表的文本输出流o
                o.println(message);
            }
        }
    }
    
    public static void main(String[] args) {
        try {
            TCPServer server = new TCPServer();//聊天室服务端
            server.start();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     *与指定客户端互交
     *
     */
    private class ClientHandler implements Runnable{//Runnable接口通过类ClientHandler实现,这个类ClientHandler定义了不含参数的run实例方法通过线程t来执行。
        /*
         *当前线程通过这个Socket与指定客户端交互
         */
        private Socket socket;
        /*
         * 远程计算机地址信息,这里是客户端的地址
         */
        private String host ;
        public ClientHandler(Socket socket){
            this.socket = socket;
            /*
             *通过Socket可以获取远端计算机地址信息
             */
            InetAddress address = socket.getInetAddress();
            /*
             * 获取远端计算机IP地址的字符串格式
             */
            host = address.getHostAddress();
        }
        /**
         * 客户端读取远端数据,类ClientHandler定义的不含参数的run实例方法
         *
         */
        public void run() {
            PrintWriter pw = null;
            try {
                /*
                 * InputStream getInputStream()
                 * Socket提供的该方法可以获取一个输入流
                 * 通过该流客户读取到远端计算机发送过来的数据
                 */
                Scanner sc = new Scanner(System.in);
                InputStream in = socket.getInputStream();//返回套接字输入字节流给in,InputStream将操作委托给通道套接字
                InputStreamReader isr = new InputStreamReader(in,"UTF-8");//从字节流in中读取多个字节转换为字符流到isr,使用指定的名称为UTF-8的字符集,也可以使用平台默认的字符集
                final BufferedReader br = new  BufferedReader(isr);//从字符输入流isr中读取文本到br,缓冲字符提供对字符、数组、和行的有效读取。
                /*
                 * 通过Socket获取输出流,用于将数据发送给客户端
                 */
                OutputStream out = socket.getOutputStream();//返回此套接字的输出流给out,OutputStream将操作委托给通道套接字
                OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");//从字符流out中写入多个字符转换成的字节流到osw,使用指定的名称为UTF-8的字符集,也可以使用平台默认的字符集
                pw = new PrintWriter(osw,true);//将格式化后的字节流osw表示输出到文本输出流pw
                System.out.println("请输入系统消息:");
                /*
                 * 将该客户端的输出流存入到共享集合中
                 * 由于多个线程都会调用该集合的add方法向其中添加输出流
                 * ,所以为了保证线程安全,可以将该集合加锁。
                 */
                synchronized(allOut){
                    allOut.add(pw);                    
                }
                String outMsg = null;
                sendMessage(host+"上线了!当前在线人数为"+allOut.size()+"人");
                while(true){                
                    //System.out.println(host+"说:"+message);
                    //回复给当前客户端
                    Thread t2 = new Thread(new Runnable(){//定义接口Runnable()的线程t2为类ClientHandler定义的不含参数的run实例与指定socket的客户端互交
                        public void run() {
                            String message = null;
                            try {
                                while((message = br.readLine())!=null){    //从文本br读取消息
                                    System.out.println("["+host+"]"+"说:"+message);

                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }        
                    }
                    );
                    t2.start();
                    outMsg = sc.nextLine();
                    pw.println(outMsg);
                    System.out.println("你(服务器)说:"+outMsg);
                    //sendMessage(host+"说"+message);
                }
            } catch (Exception e) {
                
            }finally{
                //处理客户端断开连接以后的工作
                
                //将该客户端的输出流从共享集合中删除
                synchronized(allOut){
                    allOut.remove(pw);                    
                }
                
                sendMessage(host+"下线了");
                if(socket!=null){
                    try {
                        socket.close();                        
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
            }
        }
        
    }
}

如有侵权请联系作者删除

C#实现Sokect网络编程(聊天室 三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。 阅读详情

相关推荐

SocketInputStream.java

深入剖析tomcat第三章SocketInputStream源码 * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/StringManager.java,v 1.2 2001/07/22 20:25:14 pier Exp $ * $Revision: 1.2 $ * $Date: 2001/07/22 20:25:14 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved.

Socket 中的 InputStream

无论文件读取还是Socket通信,都要操作流。Java为我们提供了InputStream和OutputStream的IO库,从数据流InputStream中读取数据时,有三种读取的方法,方法二、三本质是一样的。三种方法都返回int型,同时能够抛出IOException异常 read() read(byte[] b) read(byte[] b, int off, int len) read() 从输入流读取下一个字节,读取的返回值为该字节的int值(0~255)。如果读到流的末尾,返回-1。方法会一

明阳 3334

发那科FOCAS 1/2文档——核心库文件

在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。

snailiot的博客 1021

Socket基础使用

客户端 向服务器端发数据并且接收服务器的响应 package com.imooc.myFirestSocket; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io...

CBeann的博客 913

【Qt实战项目】记事本完整项目

效果图如下所示: 全部代码如下: #include “notepad.h” #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.showMaximized(); return a.exec(); }

YIZHILIUSHA2020的博客 575

n8n 快速入门1:构建一个简单的工作流

n8n 快速入门指南

engchina的专栏 1万+

Java网络编程Socket(使用字节流)

Java网络编程Socket(使用字节流)

白白白鲤鱼的博客 4157

【学习体会】Lighttools8.4.0:软件基本使用+光度学基本概念+系统初始设置

关于Lighttools8.4.0软件的安装教程,详见我的另一篇博文:【软件安装】win10下Lighttools8.4.0(64)光学系统建模软件的安装教程 在本文中,我们将学习到,光度学的基本概念、系统初始设置、物体模型坐标的使用方法、简单光学系统实例、系统浏览器的作用和内容、设置虚拟相机并渲染视图中的图像、仿真结果3D显示等。 如果有其他感兴趣的内容但是我又没有写的,欢迎在评论区留言! 光度学的基本概念 软件的基本介绍 参考博文:https://www.docin.c...

LeonJin的博客 2万+

Socket的输入流InputStream阻塞问题

项目场景: 使用Socket中的输入流InputStream的时候,用了while循环判断当读出数据等于-1时停止循环。 InputStream inputStream = socket.getInputStream(); byte[] b = new byte[1024]; int len=0; while((len=inputStream.read(b))!=-1){ System.out.println(new String(b,0,len)); } 原因分析: Socket中的输入流Inp

weixin_53509920的博客 2959

【语音识别入门】特征提取(Python完整代码)

给定一段音频,请提取12维MFCC特征和23维FBank,阅读代码预加重、分帧、加窗部分,完善作业代码中FBank特征提取和MFCC特征提取部分,并给出最终的FBank特征和MFCC特征,存储在纯文本中,用默认的配置参数,无需进行修改。抽样时频率不够高,抽样出来的点既代表了信号中的低频信号的样本值,也同时代表高频信号样本值,在信号重建的时候,高频信号被低频信号代替,两种波形完全重叠在一起,形成严重失真。DFT得到了每个频带上信号的能量,但是人耳对频率的感知不是等间隔的,近似于对数函数。

weixin_51293984的博客 1万+

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

socket的输入输出中InputStream的read函数三个参数的说明

read public int read(byte[] b, int off, int len) throws IOException将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。 在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 如果 len 为 0,则不读取任何字节并返回 0;否则,尝试...

pvmsmfchcs的博客 1703

手把手带你死磕ORBSLAM3源代码(一)目录详解

ORB-SLAM3是一种基于特征点的稀疏实时单目SLAM(Simultaneous Localization and Mapping)系统。它是ORB-SLAM系列模型的第三代版本,用于在无人机、机器人和增强现实等领域中进行实时定位和建图。ORB-SLAM3使用了一种特征点提取和描述算法,称为ORB(Oriented FAST and Rotated BRIEF)。该算法能够提取图像中的稳定特征,并将其用于地图建立和相机定位。

anananajiushiwo的博客 2301

利用soket 创建已经简单的聊天室程序

#include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pthread.h> #include<unistd.h> #include<stdio.h> #include<string.h> #include<c...

Dam_Sam的博客 370

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

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

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

nodjs+soket.io+webRTC实现聊天室实录

nodjs+soket.io+webRTC实现聊天室实录 内容做完再上

qq_39369673的博客 588

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Soket网络编程之Unity多人聊天室

开始学习网络游戏编程啦,但是开始还是要打个基础,因此就从多人聊天室开始啦,这里做个笔记方便自己将来回顾和学习,当然里面有哪些不对的或者需要改进的,希望大神看到后能够多多指教!这里由于代码里面的注释写得很详细我就不再添加多余的文字说明了(我这里使用的是C#)。 一.搭建服务器,直接在VS编辑器中新建C#控制台项目,其代码如下两个脚本: 1.Program.cs using System; ...

xmx5166的博客 1205

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

vue中使用 soket.io建立小型聊天室

1.首先在vue脚手架里下载soketio的依赖 npm install vue-socket.io --save npm install socket.io-client --save 2.在 main.js里面引用 Vue.use(new VueSicketio({ debug: true, connection: 'http://192.168.0.188:2...

weixin_42790916的博客 981

C#基于Socket的简单聊天室实践

序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能。 实现的细节:服务端启动一个监听套接字。每一个客户端连接到服务端,都是开启了一个线程,线程函数是封装了通信套接字,来实现与客户端的通信。多个客户端连接时产生的通信套接字用一个静态的Dictionary保存。具体...

weixin_33842304的博客 236

基于Socket的网络聊天室编程(第一版)

一:什么是套接字 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应...

weixin_34054931的博客 102

Java Socket聊天室

Socket聊天室1 创建登录判断类UserLogin2 创建登录服务器LoginServer3 创建聊天服务器ChatServer4 创建客户端Client5 创建服务器用于处理聊天的线程类ChatThread6 创建客户端Client用于发送消息的线程类WriteThread7 创建客户端Client用于接收消息的线程类ReadThread8 测试8.1 登录8.2 群聊8.2 单聊 1 创建登录判断类UserLogin import java.util.HashSet; import java.uti

dreaming9420的博客 1830

基于Java Socket写一个多线程的聊天室(附源码)

Socket编程是在TCP/IP上的网络编程,但是Socket在上述模型的什么位置呢。这个位置被一个天才的理论家或者是抽象的计算机大神提出并且安排出来​ 我们可以发现Socket就在应用程序的传输层和应用层之间,设计了一个Socket抽象层,传输层的底一层的服务提供给Socket抽象层,Socket抽象层再提供给应用层,问题又来了,应用层和Socket抽象层之间和传输层,网络层之间如何通讯的呢,了解这个之前,我们还是回到原点。

QUIT_0110的博客 1795

基于python.Socket实现在线局域网聊天室(支持群聊、私聊)

不说废话直接上代码链接:theFly6/tcp-chat-online: 计网课设:基于TCP协议实现的局域网网络聊天室 (github.com)

weixin_69657263的博客 443

Socket编程---聊天室终极版-私聊&群聊

文章目录前言https://blog.youkuaiyun.com/buluke12138/article/details/124129658?spm=1001.2014.3001.5501一、私聊对象的指定二、程序的改变总结 前言 昨天我写了Socket编程的聊天室项目(地址放下边),不过没有放私聊功能,今天来加上 https://blog.youkuaiyun.com/buluke12138/article/details/124129658?spm=1001.2014.3001.5501 一、私聊对象的指定 想要私聊我们

buluke12138的博客 1237

JAVA Soket、ServerSocket通信

JAVA Soket、ServerSocket通信IP地址和端口号 打开命令提示符输入 :cmd,输入ipconfig后按下回车,找到ivp4地址。它就是你的IP地址。 创建一个服务器非常简单,在构造方法里面输入一个端口号,这个端口号有一个范围0~65535: ServerSocket server=new ServerSocket(9090); 如果你看到这样的异常信息:java.net.B

huosanghuakai 999

express+socket简易聊天室

express+socket+nodejs简易聊天室

动感超人的博客 2688
上一篇: JAVA -------- 创建TCP服务传递数据
下一篇: Java + OpenCv 根据PID/VID调用指定摄像头
Java程序之猿
博客等级 码龄9年 2599粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值