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

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

相关文章

  • Java8内存模型PermGen Metaspace实例解析

    Java8内存模型PermGen Metaspace实例解析

    这篇文章主要介绍了Java8内存模型PermGen Metaspace实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java动态修改配置即时生效的方式WatchService

    Java动态修改配置即时生效的方式WatchService

    这篇文章给大家分享了Java动态修改配置即时生效的方式WatchService的相关知识点内容,有兴趣的朋友可以参考学习下。
    2018-06-06
  • java非递归实现之二叉树的前中后序遍历详解

    java非递归实现之二叉树的前中后序遍历详解

    树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历),本文将给大家详细的介绍,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • 学习Java之IO流中有哪些复杂的API

    学习Java之IO流中有哪些复杂的API

    这篇文章我们要先对IO流的API有个基本的认知,因为IO流的类和方法太多了,我们不得不专门学习一下,所以本文就给大家详细的讲讲Java IO流中复杂的API,需要的朋友可以参考下
    2023-09-09
  • java 将数据加载到内存中的操作

    java 将数据加载到内存中的操作

    这篇文章主要介绍了java 将数据加载到内存中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java 类与对象详细

    Java 类与对象详细

    这篇文章主要介绍了Java 类与对象,在Java中,我们把对象的特征称为属性,对象的用途称为方法,具有相同属性和方法的对象,我们把他们归为一类,简称类。下面文章讲详细介绍什么是Java类与对象,需要的朋友可以参考一下
    2021-10-10
  • Java生成表格图片的实例代码

    Java生成表格图片的实例代码

    这篇文章主要介绍了Java生成表格图片的实例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • Java并发编程之ReentrantLock实现原理及源码剖析

    Java并发编程之ReentrantLock实现原理及源码剖析

    ReentrantLock 是常用的锁,相对于Synchronized ,lock锁更人性化,阅读性更强,文中将会详细的说明,请君往下阅读
    2021-09-09
  • Java和Rust实现JSON序列化互转的解决方案详解

    Java和Rust实现JSON序列化互转的解决方案详解

    这篇文章主要为大家详细介绍了Java和Rust实现JSON序列化互转的解决方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • java 学习笔记(入门篇)_多选择结构switch语句

    java 学习笔记(入门篇)_多选择结构switch语句

    在java中为多路分支选择流程专门提供了switch语句,switch语句根据一个表达式的值,选择运行多个操作中的一个,感兴趣的朋友可以了解下
    2013-01-01

最新评论