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

news2024/11/20 9:24:29

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

                                            ---同行者联盟

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.coloradmin.cn/o/1811289.html

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

相关文章

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

图像识别是很常用的AR功能!AR foundation 可以帮助我们轻松实现! 1.安装插件 首先还是在资源包中导入ARfoundation 。然后搭建基本的AR ARFoundation框架! 2.创建AR session 和XR origin结构! 3.然后在XR Origin 物体身上添加A…

GIS之arcgis系列07:conda环境下安装arcpy环境

首先将python27环境下的“Desktop10.8.pth”拷贝到anaconda环境下。 路径如下(仅参考): C:\Python27\ArcGIS10.8\Lib\site-packages\Desktop10.8.pth D:\Anaconda\Lib\site-packages 在anaconda prompt中穿创建一个新环境 conda create -…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动,也可以以多机器分布式方式启动。 任务的提交模式有三种:application mode、session model、per-job mode(1.4x版本后过时)。 注意区分任务的提交模式与集群的部署模式区别。 以…

idea从git拉取代码需要输入token问题解决

idea使用git 推送代码时,提示token问题,这是因为你的代码仓库是gitlab, 然后打开修改代码后推送时,会默认使用gitlab插件,所以提示输入token解决方式就是把gitlab插件取消使用这样就好了。 取消之后再进行拉取代码即可…

华为鲲鹏应用开发基础:鲲鹏处理器及关键硬件特性介绍(二)

1. 鲲鹏简介 1.1 鲲鹏处理器简介 鲲鹏处理器是华为自研的基于ARMv8指令集开发的数据中心级处理器 1.2 基于鲲鹏主板的多样化计算产品 1.3 基于鲲鹏920的华为TaiShan(泰山) 200服务器 1.3.1 TaiShan 2280服务器内部视图 1.3.2 TaiShan 2280服务器物理结构 1.3.3 TaiShan 2280服…

4_机械臂位姿求逆理论及代码计算

1、aubo arcs sdk poseInverse 使用例子 auto cur_pose rpc_cli->getRobotInterface(robot_name)->getRobotState()->getTcpPose();// 2.288083 0.035207 1.550335auto pose_inv rpc_cli->getMath()->poseInverse(cur_pose);//结果:0.118611 -0.57…

数据不归路?文件清理的后悔药,2个文件恢复技巧

手机已成为我们生活中不可或缺的重要工具,它不仅仅是一个通讯设备,更是我们存储个人信息、工作文件、照片和视频等宝贵资料的仓库。然而,生活中的意外总是难以预料,有时候我们可能会不小心删除重要的文件,或者因为手机…

【c语言】文件操作,解开你的疑惑

文件操作 为什么使用文件什么是文件文件的分类文件名 二进制文件和文本文件文件的打开与关闭流与标准流流标准流 文件指针文件的打开与关闭 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 为什么使用文件 我们程序运行的数据是运行在内存中的,当成程序…

在线课堂知识付费小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在线课堂知识付费小程序源码系统是基于当前主流技术栈开发的,支持微信小程序端的在线教育平台解决方案。它不仅包含了课程发布、在线学习、支付系统等基础功能,还融入了社区互动、用户管理、数据分析等高级特性,旨在打造一个全方位…

filezilla-server 1.8.1 设置

filezilla-server 1.8.1 设置: 1. 2. 3. 4. 其他不用配置, 5. 6. 7. 8. 9. 如果外网连不上 filezilla-server 提示无法连接到服务器, 多半是 filezilla-server 所在的电脑没有通过防火墙允许,打开 Windows defender 防…

万兴优转 v15 解锁版安装教程(全能音视频格式转换器)

前言 Wondershare UniConverter(万兴优转)国产全能音视频格式转换器。万兴格式转换器具有音视频格式转换、合并视频、视频压缩、视频编辑、视频录制、下载视频、元数据修复、VR视频转换、字幕编辑器、GIF制作、DVD刻录等一站式视频工具箱功能。万兴转换…

从文本文件中读取博客数据并将其提取到文件中

通常情况下我们可以使用 Python 中的文件操作来实现这个任务。下面是一个简单的示例,演示了如何从一个文本文件中读取博客数据,并将其提取到另一个文件中。 假设你的博客数据文件(例如 blog_data.txt)的格式 1、问题背景 我们需…

如何压缩jpg图片到200k以下?跟着我操作!

在现代社交媒体和网络分享的时代,经常需要上传和分享各种图片。然而,有时候大尺寸的JPEG图片可能会成为上传和分享的一道难题,特别是当需要在网络条件不佳或存储空间有限的情况下。为了解决这个问题,我们需要学会如何压缩jpg图片到…

鸿蒙轻内核M核源码分析系列二十 Newlib C

LiteOS-M内核LibC实现有2种,可以根据需求进行二选一,分别是musl libC和newlibc。本文先学习下Newlib C的实现代码。文中所涉及的源码,均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。 使用Musl C库的时候&#xff0c…

什么是AIGC?AIGC是否会颠覆未来的内容生产模式?普通人如何利用好AI提高内容生产效率?

2024年是AI元年,正好我在AI公司里面工作,对AIGC有着几年的研究,接下来把我这对AIGC的学习经验毫无保留的给大家分享一下 AIGC 的简要介绍 在狭义上,AIGC是指利用AI自动生成内容的生产方式,比如自动写作、自动设计等。…

【机器学习】基于3D CNN通过CT图像分类预测肺炎

1. 引言 1.1. 研究背景 在医学诊断中,医生通过分析CT影像来预测疾病时,面临一些挑战和局限性: 图像信息的广度与复杂性: CT扫描生成的大量图像对医生来说既是信息的宝库也是处理上的负担。每组CT数据可能包含数百张切片&#xf…

金智易表通流程设置的若干问题

1、审批节点的审批人取应用权限组,权限组内任一人审批即可通过 在流程节点的主要配置环节,选择候选组 二、已审菜单要求看到自己审过的也能看到别人审过的,即能看到所有已审的记录 管理设置中取消按钮对流程的依赖,不根据流程审批…

汇编:数组数据传送

要在32位汇编中实现数组数据的传送,可以使用字符串操作指令 MOVS 以及其前缀 REP,可以高效地复制数组数据。 MOVS 指令是一种字符串操作指令,用于将数据从源地址移动到目标地址。MOVS 指令有不同的变种,可以处理不同大小的数据&a…

Mimio安装

mkdir -p /usr/local/develop/minio/bin mkdir -p /usr/local/develop/minio/bin wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/develop/minio/bin/minio 编辑脚本 启动脚本 vim /usr/local/develop/minio/start_minio.sh #!/bin/bash # 设…

HTML,CSS,JavaScript实例 —— 齿轮,按钮

文章目录 一、动态按钮二、CSS实例三、滚动的齿轮 一、动态按钮 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">html,body {background: black;height: 100%;displa…