大一学生分享网络编程聊天室-简单私聊

每天过得充实,你将不会焦虑

                                            ---同行者联盟

Socket

是一种规范(标准),封装了TCP协议的通信细节,使得我们使用它就可以完成与远端计算机的TCP链接,以及数据的传输。并且可以完成数据传输基于双向流的读写操作,Java语言里封装了Socket类,直接使用即可

客户端给服务端发送消息(写),服务端读到信息 (读) 以后发响应给客户端(写),客户端接收响应信息(读),所以客户端和服务端都具有读+写能力

做一个类似于聊天室的功能,分为以下3个步骤

1、客户端连接服务端

2、客户端成功给服务端发送消息,服务端接收消息

3、客户端给服务端发送消息,服务端接收消息后给出响应,客户端接收响应 (一人一句)

1、客户端连接服务端

客户端代码

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("开始连接");
        // 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列
        Socket socket = new Socket("localhost",8088);
        System.out.println("连接成功!!!");
    }
}

服务端代码

public class SocketServer {
    public static void main(String[] args) throws IOException {
        // 创建服务端对象,确定好接收的端口信息
        ServerSocket  serverSocket = new ServerSocket(8088);
        System.out.println("等待客户端连接");
        // 舰艇有没有客户端发请求给8088端口号,accept是阻塞方法,一直会监听客户端的连接,直到才客户端连接上为止
        Socket socket = serverSocket.accept();
        System.out.println("客户端已连接!!!");
    }
}

注意⚠️

运行时必须先运行服务端,举例说明,小明(客户端)给小红(服务端)打电话,但是前提必须是小红得有手机号,所以第一步是小红先申请电话号,第二步是小明打电话给小红,对应我们的代码是服务端先申请端口号,客户端才能给该host的端口发送连接请求

2、客户端给服务端发送消息,服务端能成功接收

客户端代码:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
    Socket socket;
    public SocketClient() {
        System.out.println("开始连接");
        // 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列,8080最容易被占用
        try {
            socket = new Socket("localhost", 8088);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            System.out.println("客户端已启动");
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 自动行刷新,即不会将缓冲区装满,按行刷新写数据
            PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
            Scanner sc = new Scanner(System.in);
            while(true){
                String message = sc.nextLine();
                printWriter.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
          //  关流
        }
    }
    public static void main(String[] args) {
        SocketClient client = new SocketClient();
        client.start();
    }
}

服务端代码:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
    ServerSocket serverSocket;
    public SocketServer() {
        // 创建服务端对象,确定好申请的端口号
        try {
            serverSocket = new ServerSocket(8088);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start() {
        System.out.println("服务端已启动");
        System.out.println("等待客户端连接");
        try {
            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接!!!");
            // 从获取的客户端对象中,获取数据,前提是获取IO流
            InputStream inputStream = socket.getInputStream();
            // 转化为字符流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            //为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line = null;
            while ((line = bufferedReader.readLine())!=null) {
                System.out.println("客户端发来消息:"+line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
          //  关流
        }
    }
    public static void main(String[] args) {
        SocketServer socketServer = new SocketServer();
        System.out.println("端口好已成功申请");
        socketServer.start();
    }
}

结果:

3、客户端与服务端正常交流一人一句

客户端代码

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
    Socket socket;
    public SocketClient() {
        System.out.println("开始连接");
        // 创建网络连接对象,并指定访问地址+端口号,端口号不要乱指定,建议大家使用80系列,8080最容易被占用
        try {
            socket = new Socket("localhost", 8088);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            System.out.println("客户端已启动");
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 自动行刷新,即不会将缓冲区装满,按行刷新写数据
            PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
            Scanner sc = new Scanner(System.in);
            // 从获取的客户端对象中,获取数据,前提是获取IO流
            InputStream inputStream = socket.getInputStream();
            // 转化为字符流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            //为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line = null;
            while(true){
                String message = sc.nextLine();
                printWriter.println(message);
                line = bufferedReader.readLine();
                if(line!=null){
                    System.out.println("服务端发来消息:"+line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
          //  关流
        }
    }
    public static void main(String[] args) {
        SocketClient client = new SocketClient();
        client.start();
    }
}

服务端代码

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SocketServer {
    ServerSocket serverSocket;
    public SocketServer() {
        // 创建服务端对象,确定好申请的端口号
        try {
            serverSocket = new ServerSocket(8088);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start() {
        System.out.println("服务端已启动");
        System.out.println("等待客户端连接");
        try {
            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接!!!");
            // 从获取的客户端对象中,获取数据,前提是获取IO流
            InputStream inputStream = socket.getInputStream();
            // 转化为字符流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            //为了更高效,我们可以加上缓冲流,而且BufferReader还可以按行读
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 自动行刷新,即不会将缓冲区装满,按行刷新写数据
            PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
            Scanner sc = new Scanner(System.in);
            String line = null;
            while ((line = bufferedReader.readLine())!=null) {
                System.out.println("客户端发来消息:"+line);
                printWriter.println(sc.nextLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
          //  关流
        }
    }
    public static void main(String[] args) {
        SocketServer socketServer = new SocketServer();
        System.out.println("端口好已成功申请");
        socketServer.start();
    }
}

结果:

客户端结果截图:

服务端结果截图:

注意:

针对大学生的辅导班和准大学生的提前学

1) 对于面试而言,最重要的是算法和项目,现特邀P8大佬,哈工程研究生毕业者授数据结构与算法,带领大家学习300道经典算法题;

2) 项目课开始启动,带领大家领略企业中的项目流程

3) 暑假学习包括但不限于mysql、Java体系(语言、框架、javaWeb等)、C++、C语言、python语言、数据结构与算法、linux、redis;

4) 大数据的学习

有意向的可以沟通+V 17865578823

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘:全自动阅读挂机项目,号称自动阅读一天窗口10-50+(脚本+教程)

首先,我们需要对全自动阅读挂机项目有一个基本的认识。这是一个高效利用时间和精力,使阅读成为一种被动行为的新型项目。它将阅读与电脑操作结合,通过挂机的方式,使得在忙碌的生活中仍能保持高效学习。 1.全自动阅读挂机项目背后…

G5 - Pix2Pix理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 理论知识图像翻译CGANU-NetPix2Pix损失函数模型结构生成器差别器 模型效果总结与心得体会 理论知识 前面已经学习了GAN与CGAN,这节开始学习P…

linux使用crontab定时执行url

在Linux操作系统中,Crontab是一个非常实用的工具,可以帮助用户定时执行任务,以达到自动化管理系统的目的。而在使用Crontab时,有时候我们可能需要让系统定时访问某个URL,以实现特定的功能或操作。本文将介绍如何使用Cr…

斯坦福新研究:RAG能帮助LLM更靠谱吗?

近年来,大型语言模型(LLM)在自然语言处理领域取得了显著的进展,但它们也存在一些问题,如容易产生幻觉和无法提供最新的知识。为了解决这些问题,研究人员提出了一种名为检索增强生成(RAG&#xf…

猫头虎分享:2024应届生择业在大模型和智能机器人之间该如何选择?

猫头虎分享:2024应届生择业在大模型和智能机器人之间该如何选择? 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的…

快速入门链路追踪sleuth整合zipkin(代码演示)

1、演示项目背景 2、pom.xml 3、启动项目 4、测试 5、保存数据到数据库 6、通过mq保存数据到mysql 7、通过mq保存数据到es 1、演示项目背景 下载zipkin,建议使用2.x版本的,3.x版本的要求jdk高版本。如果自己是1.8,就下载2.x的 下载地…

Postman环境变量以及设置token全局变量!

前言百度百科解释: 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象,它…

Ubuntu server 24 (Linux) 安装部署 Zabbix 7.0 LTS

一 安装Mysql 8.03 testtest:~$ mysqld --version /usr/sbin/mysqld Ver 8.0.36-2ubuntu3 for Linux on x86_64 ((Ubuntu)) #mysql 大于8.03.x ,启动zabbix-server会报错如下 Unable to start Zabbix server due to unsupported MySQL database version (8.04.00). Must not…

英伟达最新GPU和互联路线图分析

Nvidia在计算、网络和图形领域独树一帜,其显著优势在于雄厚的资金实力及在生成式人工智能市场的领先地位。凭借卓越的架构、工程和供应链,Nvidia能够自由实施创新路线图,引领行业未来。 到 21 世纪,Nvidia 已经是一个非常成功的创…

GStreamer学习2.1----获取mp4中的图片

这里通过获取mp4中的图片例子来加深Gstreamer的理解,问问AI实现这样功能的命令, 得到 gst-launch-1.0 filesrc locationtest.mp4 ! qtdemux ! queue ! h264parse ! avdec_h264 ! videoconvert ! jpegenc ! multifilesink locationoutput_image_%03d.jp…

大福利!微信付费进群源码

微信付费进群源码 前言效果图搭建教程源码领取下期更新预报 前言 1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的,电脑…

MEGALODON:突破传统,实现高效无限上下文长度的大规模语言模型预训练和推理

在人工智能领域,尤其是在自然语言处理(NLP)中,大模型(LLMs)的预训练和推理效率一直是研究的热点。最近,一项突破性的研究提出了一种新型神经网络架构——MEGALODON,旨在解决传统Tran…

Redis 7.2.x 主从复制+哨兵模式

IP操作系统服务版本192.168.140.153CentOS 7redis-master,sentinel7.2.5192.168.140.156CentOS 7redis-slave,sentinel7.2.5192.168.140.159CentOS 7redis-slave,sentinel7.2.5 一、安装Redis 配置主从复制 参考下面文档: Redis 7.2.x 主从复制-CSDN博客文章浏览…

论文略读:Onthe Expressivity Role of LayerNorm in Transformers’ Attention

ACL 2023 研究了LayerNorm在 Transformers 中对注意力的作用LayerNorm为Transformer的Attention提供了两个重要的功能: 投影,projection LayerNorm 帮助 Attention 设计一个注意力查询,这样所有的Key都可以平等地访问通过将Key向量投影到同一…

pinctrl 和 gpio 子系统实验学习

pinctrl 子系统主要工作内容如下: ①、获取设备树中 pin 信息。 ②、根据获取到的 pin 信息来设置 pin 的复用功能 ③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。 对于我们使用者来讲,只需要在设备树里面…

【计算机网络基础】OSI七层网络模型 TCPIP四层网络模型

文章目录 ISO介绍网络模型介绍OSI七层模型OSI七层模型介绍OSI七层特点一、TCP/IP四层模型介绍二、TCP/IP四层模型TCP/IP协议簇一次C/S通信 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分…

人工智能和机器学习这两个概念有什么区别?

什么是人工智能? 先来说下人工智能,人工智能(Artificial Intelligence),英文缩写为AI,通俗来讲就是用机器去做在过去只有人能做的事。 人工智能最早是由图灵提出的,在1950年,计算机…

【背就有效】软考中项计算公式汇总,简答题轻松拿下

宝子们注意啦!系统集成管理师的报名8月就要开始啦!你准备好迎接挑战了吗? 备考下半年软考的小伙伴们,在这里给大家准备了一份超实用的备考秘籍——系统集成项目管理工程师计算公式汇总。亲测有效,每天只需抽出一点时间…

数据库错误[ERR] 1071 - Specified key was too long; max key length is 1000 bytes

环境:phpstudy的mysql8 索引长度问题: 试了很多解决办法,例如需改配置: set global innodb_large_prefixON; set global innodb_file_formatBARRACUDA; 试了还是有问题,直接启动不了了。因为mysql8取消了这个配置。…

[linux]基于Ubuntu24.04原内核6.8.0升级到6.9.0

物理机操作系统: 虚拟机操作系统: Ubuntu 24.04 下载地址: https://mirror.nju.edu.cn/ubuntu-releases/24.04/ubuntu-24.04-desktop-amd64.iso VM版本信息: 内核源代码来源: https://ftp.sjtu.edu.cn/sites/ftp.kern…