Java实现单线程聊天室

 更新时间:2022年09月15日 16:47:32   作者:#define微光  
这篇文章主要为大家详细介绍了Java实现单线程聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java实现单线程聊天室的具体代码,供大家参考,具体内容如下

一. Socket API简介

1. Socket编程

Java.net.Socket类代表一个套接字,并且为服务器程序提供了一种来监听客户端并与他们建立连接的一种机制.

套接字使用TCP提供了两台计算机之间的通信机制,客户端创建一个套接字并尝试连接服务器的套接字,当连接建立时,服务器就会创建一个Socket对象,客户端和服务器就可以通过Socket对象的写入和读取来进行通信,这就是聊天室的原理.

两台计算机使用套接字建立TCP连接时会出现以下步骤: 

  • 服务端实例化一个ServerSocket对象,表示通过服务器上的端口通信
  • 服务端调用ServerSocket的accept()方法,该方法将一直等待,直到客户端连接上服务器上给定的端口
  • 服务端正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接
  • Socket类的构造函数试图将客户端连接到指定的服务器和端口号上,如果通信被建立,则在客户端创建一个Socket对象能够与服务端进行通信
  • 在服务端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket

TCP是一个双向通信协议,连接建立后,通过使用I/O流进行通信,每一个socket都有一个输出流和输入流,客户端的输出流连接到服务端的输入流,服务端的输出流连接到客户端的输入流.

二. 实现单线程模式的聊天室

首先我们来理清整个编程的思路:

socket编程

1.创建项目:

     1.1 服务器模块ServerSocket
     1.2 客户端模块Socket

2. 服务器端

     2.1 创建serverScoket,绑定端口
     2.2 接收客户端连接,Socket
     2.3 通过Socket连接,发送和接收数据
     2.4 关闭ServerSocket/Socket

3. 客户端

     3.1 创建Socket,指定服务器的地址和端口号
     3.2 通过Socket发送和接收数据
     3.3 关闭Socket 

1. 服务端

package single;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * Author:weiwei
 * description:单线程聊天室服务端
 * Creat:2019/3/8
 **/
public class singleThreadserver {
    public static void main(String[] args) {
 
        try {
 
            //1. 创建服务端ServerSocket,监听6666端口
            ServerSocket serverSocket = new ServerSocket(6666);
            System.out.println("服务器启动..."+serverSocket.
                    getLocalSocketAddress());  //服务器启动,打印当前地址
 
            //2. 接收客户端连接
            Socket socket = serverSocket.accept();  //调用accept()方法
            System.out.println("接收到客户端连接..."+socket.
                    getRemoteSocketAddress());  //接收远程客户端
 
            //3. 接收和发送数据
            //3.1 接收数据
            InputStream inputStream = socket.getInputStream();  //获取字节流
            Scanner scanner = new Scanner(inputStream);   //字节流转字符流
            String message = scanner.nextLine();   //读数据,按行读,读一行
            System.out.println("收到客户端的消息:"+message); //打印接收到的消息
 
            //3.2 发送数据
            OutputStream outputStream = socket.getOutputStream();  //获取字节流
            OutputStreamWriter writer = new OutputStreamWriter(outputStream);//字节流转字符流
            writer.write("你好,客户端,我很好.\n");  //写数据
            writer.flush();  //刷新(网通信)
 
 
            //4. 关闭
            serverSocket.close();
            System.out.println("服务器关闭");
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 客户端 

package single;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * Author:weiwei
 * description:单线程聊天室客户端
 * Creat:2019/3/8
 **/
public class singleThreadclient {
    public static void main(String[] args) {
 
        try {
 
            //1. 创建Socket客户端,连接指定服务地址和端口号
            Socket socket = new Socket("127.0.0.1",6666);
            System.out.println("客户端创建..."+socket.
                    getLocalSocketAddress());  //客户端创建,打印当前地址
 
            //2. Socket发送和接收数据
            //2.1 发送数据
            OutputStream outputStream = socket.getOutputStream();  //获取字节流
            OutputStreamWriter writer = new OutputStreamWriter(outputStream);  //字节流转字符流
            writer.write("你好,服务器.\n");  //写数据
            writer.flush();  //刷新
 
            //2.2 接收数据
            InputStream inputStream = socket.getInputStream();  //获取字节流
            Scanner scanner = new Scanner(inputStream);  //字节流转字符流
            String message = scanner.nextLine();  //读数据,按行读
            System.out.println("接收到服务器的消息:"+message); //打印接收到的数据
 
            //3. 关闭
            socket.close();
            System.out.println("客户端关闭");
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Java中跳跃表的原理和实现

    详解Java中跳跃表的原理和实现

    跳跃表(Skip list)是有序链表的扩展,简称跳表,它在原有的有序链表上增加了多级索引,通过索引来实现快速查找,实质上是一种可以进行二分查找的有序链表。本文主要为大家介绍了跳跃表的原理和实现,需要的可以参考一下
    2022-12-12
  • SpringBoot如何自定义starter

    SpringBoot如何自定义starter

    这篇文章主要介绍了SpringBoot如何自定义starter,Springboot的出现极大的简化了开发人员的配置,而这之中的一大利器便是springboot的starter,starter是springboot的核心组成部分,下面来看看集体引用过程吧
    2022-01-01
  • 关于java连接池/线程池/内存池/进程池等汇总分析

    关于java连接池/线程池/内存池/进程池等汇总分析

    这篇文章主要介绍了关于java连接池/线程池/内存池/进程池等汇总分析,本文将介绍池技术的由来、原理、优缺点以及常见的池技术类型,需要的朋友可以参考下
    2023-04-04
  • Spring Cloud Admin健康检查 邮件、钉钉群通知的实现

    Spring Cloud Admin健康检查 邮件、钉钉群通知的实现

    这篇文章主要介绍了Spring Cloud Admin健康检查 邮件、钉钉群通知的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot项目鉴权的4种方式小结

    SpringBoot项目鉴权的4种方式小结

    本文主要介绍了SpringBoot项目鉴权的4种方式小结,包括传统AOP、拦截器、参数解析器和过滤器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • jvm双亲委派 vs 破坏双亲委派理解加载器的权责分配

    jvm双亲委派 vs 破坏双亲委派理解加载器的权责分配

    这篇文章主要为大家介绍了jvm双亲委派 vs 破坏双亲委派对比来理解加载器的权责分配,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java编程子类能否重写父类的静态方法探索

    Java编程子类能否重写父类的静态方法探索

    关于子类能否重写父类的静态方法,对像我这种初级的编程爱好者来说仍是值得讨论的一件事,下面我们通过具体实例,对此问题进行简单的探索。
    2017-10-10
  • Java Zip压缩之简化文件和文件夹的压缩操作

    Java Zip压缩之简化文件和文件夹的压缩操作

    这篇文章主要给大家介绍了关于Java Zip压缩之简化文件和文件夹的压缩操作,Zip压缩是一种常见的文件压缩格式,它将多个文件和文件夹打包成一个以.zip为后缀的压缩包,需要的朋友可以参考下
    2023-10-10
  • 详解Spring Boot读取配置文件与配置文件优先级

    详解Spring Boot读取配置文件与配置文件优先级

    这篇文章主要介绍了详解Spring Boot读取配置文件与配置文件优先级,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 详解Java变量与常量

    详解Java变量与常量

    这篇文章主要介绍了Java变量与常量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论