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();
        }
    }
}

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

相关文章

  • spring boot使用RabbitMQ实现topic 主题

    spring boot使用RabbitMQ实现topic 主题

    本篇文章主要介绍了spring boot使用RabbitMQ实现topic 主题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • MyBatis中example.createCriteria()方法的具体使用

    MyBatis中example.createCriteria()方法的具体使用

    本文详细介绍了MyBatis的Example工具的使用方法,包括链式调用指定字段、设置查询条件、支持多种查询方式等,还介绍了mapper的crud方法、and/or方法的使用,以及如何进行多条件和多重条件查询,感兴趣的可以了解一下
    2024-10-10
  • Java责任链设计模式实例分析

    Java责任链设计模式实例分析

    这篇文章主要介绍了Java责任链设计模式,结合实例形式详细分析了Java责任链设计模式的原理与相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Java中的异常处理(try,catch,finally,throw,throws)

    Java中的异常处理(try,catch,finally,throw,throws)

    本文主要介绍了Java中的异常处理,文章主要介绍的异常处理包括5个关键字try,catch,finally,throw,throws,更多详细内容需要的朋友可以参考一下
    2022-06-06
  • Intellij IDEA下Spring Boot热切换配置

    Intellij IDEA下Spring Boot热切换配置

    这篇文章主要介绍了Intellij IDEA下Spring Boot热切换配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 解决Spring Cloud Feign 请求时附带请求头的问题

    解决Spring Cloud Feign 请求时附带请求头的问题

    这篇文章主要介绍了解决Spring Cloud Feign 请求时附带请求头的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java基础学习之Swing事件监听

    Java基础学习之Swing事件监听

    今天学习java的Swing库,创建桌面应用的时候,突然发现有些按钮需要特定的功能响应,故来研究一番Swing的事件监听,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-05-05
  • 详解JAVA设计模式之代理模式

    详解JAVA设计模式之代理模式

    这篇文章主要介绍了JAVA设计模式之代理模式的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 基于Feign使用okhttp的填坑之旅

    基于Feign使用okhttp的填坑之旅

    这篇文章主要介绍了基于Feign使用okhttp的填坑之旅,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 基于mybatis like %%的问题

    基于mybatis like %%的问题

    这篇文章主要介绍了mybatis like %%的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论