Java 聊天程序案例

news2024/11/28 10:38:32

单线程版本:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//服务端
public class Server {
    public static void main(String[] args) {
        try {
            //Socket套接字(TCP/IP)
            //设置端口号
            ServerSocket server = new ServerSocket(6666);
            Socket s = server.accept();
            PrintWriter out = new PrintWriter(s.getOutputStream());
            BufferedReader br = new BufferedReader(new
                    InputStreamReader(s.getInputStream()));
            System.out.println("已连接");
            while (true) {

                String sss = br.readLine();
                System.out.println(sss);
                System.out.print("请回复消息:");
                out.write((new Scanner(System.in)).nextLine()+"\r\n");
                out.flush();
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
//客户端
public class Client {
    public static void main(String[] args) {
        try {
            //输入服务端的ip地址和端口号
            //ip地址可以用控制台ipconfig命令查询
            Socket s = new Socket("192.168.21.28", 6666);
            BufferedReader br = new BufferedReader(new
                    InputStreamReader(s.getInputStream()));
            PrintWriter out = new PrintWriter(s.getOutputStream());
            while (true) {
                System.out.print("请输入:");
                String sss = (new Scanner(System.in)).nextLine();
                out.write(sss+"\r\n");
                out.flush();
                System.out.println(br.readLine());
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

A发完1条消息后,B回复1条后,A才能继续发送1条消息,B也同理

 多线程版本:Server、Client、Read接收类、Send发送类

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Scanner;

/**
 * Server.java 是服务端类,还有Read线程类,Send线程类
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(6688);
            //accept()将会有一个中断等待
            Socket a = server.accept();
            System.out.println("有人连线");
            new Thread(new Read(a)).start();
            new Thread(new Send(a, "服务器")).start();
        } catch (IOException e) {
            System.out.println("服务器启动失败,端口6688被占用");
        }
    }
}

class Read implements Runnable {
    Socket ss = null;

    public Read(Socket ss) {
        this.ss = ss;
    }

    @Override
    public void run() {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new
                    InputStreamReader(ss.getInputStream()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        while (true) {
            String sss = null;
            try {
                sss = br.readLine();
                System.out.println(sss);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

class Send implements Runnable {
    String name = "";
    Socket ss = null;

    public Send(Socket ss, String name) {
        this.ss = ss;
        this.name = name;
    }

    @Override
    public void run() {
        PrintWriter out = null;
        try {
            out = new PrintWriter(ss.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        while (true) {
            out.printf("%s:%s\r\n", name, new Scanner(System.in).nextLine());
            out.flush();
        }
    }
}
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            Socket c = new Socket("192.168.21.28", 6688);
            new Thread(new Read(c)).start();
            new Thread(new Send(c, "客户")).start();
        } catch (Exception e) {
        }
    }
}

连接后可以随时发送和接收 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HikariCP连接池

HikariCP连接池 HikariCP连接池是高性能的JDBC连接池,官网标注的三大特点:快速、简单、可靠,性能优于其他连接池。 官网详细地说明了HikariCP所做的一些优化,总结如下: 字节码精简:优化代码,直…

领跑人机协同时代!实在智能与EFCIO携手举办AI沙龙,推动企业数字化转型

GPT翻开了AGI(通用人工智能)领域的新篇章,也开启了各行各业的新时代。毫不夸张地说,进入大模型时代,所有的应用都值得被重写一遍。同时,企业也需要积极采纳新技术和创新模式,以应对竞争压力和不…

MURF2080CT/MURF2080CTR-ASEMI快恢复对管

编辑:ll MURF2080CT/MURF2080CTR-ASEMI快恢复对管 型号:MURF2080CT/MURF2080CTR 品牌:ASEMI 芯片个数:2 芯片尺寸:102MIL*2 封装:TO-220F 恢复时间:50ns 工作温度:-50C~150C…

代码随想录day28

46. 全排列 思路:这道题首先是一个排列问题,排列问题是讲究顺序的,例如[1,2]和[2,1]是两个不一样的排列,这里的1我们会有重复使用到,但是,在每一个排列中,每一个元素只能使用一次。所以需要一个…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展,外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业,可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化,我们在这里提供了一些提…

C++模板的简单练习

运行代码&#xff1a; #include"std_lib_facilities.h"template <class T>struct S { private:T val; public:S<T>() :val(T()) {}S<T>(T tt) : val(tt) {};T& get();void set(T tt) { val tt; }ostream& operator << (ostream&a…

为什么 Splashtop 是更好用的 iOS 远程桌面应用

全球远程桌面软件市场最近达到19.2亿美元&#xff0c;表明使用任意设备实现随处远程控制越来越受欢迎。 近年来&#xff0c;企业的运营方式发生了重大改变&#xff0c;远程桌面软件已成为广泛使用的解决方案。Splashtop 是目前最好用的远程桌面工具之一&#xff0c;安全可靠且…

Android安卓实战项目(2)---健身UI APP(源码在文末)

Android安卓实战项目&#xff08;2&#xff09;—健身UI APP&#xff08;源码在文末&#xff09; 一.项目运行介绍 1.大致浏览 2.功能介绍 &#xff08;1&#xff09;功能一 第一个界面点击后可以弹出图像&#xff0c;如图&#xff1a; &#xff08;2&#xff09;功能二 界…

[Spring] 三级缓存解决循环依赖详解

什么是循环依赖 注册一个bean对象的过程&#xff1a; Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法&#xff0c;反射&#xff0c;得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…

window的anaconda下安装opencv

window安装opencv 阿巴阿巴&#xff0c;安装了多少遍的opencv今天居然搞了这么久。整理一下笔记把。 解决思路主要来源于&#xff1a;(37条消息) 导入import cv2时出现ImportError:DLL load fail:找不到指定模块的解决办法_import cv2 importerror: dll load failed: 找不到指定…

【C进阶】指针进阶(1)_二次复习版

目录 1. 字符指针 1.1常量字符串的修改 加上const解决问题 打印常量字符串 1.2数组存放的字符串 1.3例题:数组创建与常量池的区别 2. 指针数组 2.1字符指针数组 2.2整型指针数组 2.3使用3个一维数组,模拟实现一个二维数组 2.4例题: 3.数组指针 3.1 数组指针的定义…

快速上手Webpack打包指南:用简单的步骤掌握Webpack的使用技巧

目录 概念&#xff1a;1. webpack 打包简介1.0 多个 JS 文件打包&#xff1a;1.1 webpack 数组形式1.2 webpack 对象形式 总结 Webpack的打包过程可以总结为以下几个步骤&#xff1a; 1.入口点配置&#xff1a;在Webpack的配置文件中&#xff0c;我们需要指定一个或多个入口点…

Android Studio 代码模板插件实现

Android Studio 代码模板插件 背景 可以跳过背景和简述&#xff0c;从模板插件实现开始看. 开发新页面时&#xff0c;原先需要写一堆模板代码。比如用Databinding写列表结构的页面&#xff0c;需要手写以下文件&#xff1a; XxActivity.ktXxFragment.ktXxViewModel.ktXxListA…

从零开始学习CTF

前言 CTF简介 中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式 竞赛模式 解题模式&#xff1a; 在解题模式…

如何引导客户进行自助服务,提高员工工作效率?

搭建帮助中心是大多数企业都在尝试做的事情&#xff0c;它的重要性对于企业来说不言而喻。现在对于企业来说&#xff0c;搭建帮助中心或许不是什么难事&#xff0c;但是关于帮助中心&#xff0c;有几个问题需要思考清楚&#xff0c;才能让其发挥最大的价值。 一、如何让用户养成…

Android手机app页面布局方法

app页面布局方法 1. FrameLayout&#xff08;帧布局&#xff09; (1) FrameLayout是最简单的布局了。所有放在布局里的控件&#xff0c;都按照层次堆叠在屏幕的左上角。后加进来的控件覆盖前面的控件。 2. LinearLayout&#xff08;线性布局&#xff09; (1) LinearLayout按…

第九章 多组学简介

第一节 什么是多组学 多组学encode计划是一个大型国际合作计划&#xff0c;旨在研究各种生物体系中的功能元件和基因组功能。该计划的目标是建立一个全面的生物信息学数据库&#xff0c;包括人类和其他生物的基因组和表观基因组、转录组、蛋白质组、代谢组和表型组等。 多组学…

高等数学❤️第一章~第三节~极限❤️间断点及其分类

【精讲】高等数学中的间断点及其分类 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中的间断点及其分类 导言 一、间断点的概念 二、间断点的分类 必需记忆知识点 知识点1 知识点2 例题&#xff08;用于熟悉高等数学中的间断点及其…

dp算法篇Day11

“哎呀&#xff0c;哎呀&#xff0c;流云开一朵&#xff0c;哟诶嘿哟&#xff0c;哟诶嘿哟~” 51、目标和 (1) 题目解析 包括之后的一些题目&#xff0c;乍一眼看可能你不会发现它与dp问题有何相连&#xff0c;可是按照按照题目又难以想出 思路、写出代码来。因此&#xff0c;…

PostgreSQL——编码“GBK“的字符0x0xa8 0x27在编码“UTF8“没有相对应值`

问题&#xff1a;编码"GBK"的字符0x0xa8 0x27在编码"UTF8"没有相对应值 原因&#xff1a;客户端编码与服务端编码不一致 select name,setting,context from pg_settings where name like %encoding%; 解决方案&#xff1a;修改客户端编码方式和服务端一致…