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

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

                                            ---同行者联盟

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

相关推荐

  1. 2024.3.7 简易网络聊天

    2024-06-11 15:12:04       37 阅读
  2. 简易聊天

    2024-06-11 15:12:04       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 15:12:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 15:12:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 15:12:04       82 阅读
  4. Python语言-面向对象

    2024-06-11 15:12:04       91 阅读

热门阅读

  1. 设计与实现完整的余额充值系统

    2024-06-11 15:12:04       30 阅读
  2. Web前端开发学习内容:深入探索与全方位掌握

    2024-06-11 15:12:04       27 阅读
  3. C++算法——选择排序

    2024-06-11 15:12:04       28 阅读
  4. mysql数据聚合实例

    2024-06-11 15:12:04       30 阅读
  5. 用python海龟画图实现倒计时功能

    2024-06-11 15:12:04       32 阅读
  6. Webpack5 解决静态资源重复打包问题

    2024-06-11 15:12:04       26 阅读
  7. C++ CSV 中文 乱码 UTF-8 ANSI

    2024-06-11 15:12:04       33 阅读
  8. 微信小程序轮播

    2024-06-11 15:12:04       30 阅读
  9. 数据仓库技术及应用(Hive函数)

    2024-06-11 15:12:04       32 阅读