利用Socket、ServerSocket实现聊天室功能

本文介绍了使用Java的Socket和ServerSocket创建聊天室的功能。讲解了CS(Client-Server)和BS(Browser-Server)架构的区别,并探讨了TCP和UDP的可靠与不可靠传输特性。详细阐述了Socket如何封装TCP协议,以及ServerSocket在服务端的作用,包括申请端口、监听连接。同时,讨论了客户端与服务端通过Socket进行数据交互的流程,以及流的关闭和线程安全问题。
摘要由CSDN通过智能技术生成
  • CS,一对一,专门的客户端 对 服务端,比如 QQ 或者吃鸡 都是CS,
    • 缺点更新麻烦,如果QQ更新了,QQ客户端需要更新,不能新可能不能用
  • BS,多对一,就是浏览器 对服务端,更新方便,所有的素材都在服务端,比较通用
  • 客户端服务端通讯交互的话,需要规则,就是协议,socket就是传输协议,也就是通讯协议
    • 可靠传输协议TCP,我给你发送的东西100%能发到,勤拿少许,拆开拿,分成一段一段,传输慢,你拿到了告诉我,我再给你,不是一口气都给你
    • 不可靠传输协议UDP,我给你发送的东西不能100%发送,也是勤拿少许,只不过,我给你了,不管你拿没拿到,我都给你,魔兽被闷棍,游戏卡了,死了,没看到,这是就典型的UDP现象,丢一针卡一针无所谓,速度快,
  • BS交互的协议是Htpp协议,而Htpp协议底层要求的就是可靠传输协议TCP协议

  • java.net.Socket套接字
    • Socket封装了TCP协议的通讯细节
    • 使用它可以与服务端建立网络连接
    • 通过它获取两个流(一个输入,一个输出),然后使用这两个流的读写操作完成与服务端的数据交互
  • 运行在服务端的ServerSocket主要有两个作用
    • 向系统申请服务端口,客户端的Socket就是通过这个端口与服务端建立连接的
    • 监听服务端口,一旦一个客户端通过该端口建立连接会自动创建一个Socket,(交互一个创建一个)
  • 客户端
package socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 聊天室客户端
 *
 */
public class Client {
    /**
     * java.net.Socket套接字
     * Socket封装了TCP协议的通讯细节,使得我们使用它可以与服务端建立网络连接,并通过它获取两个流
     * (一个输入,一个输出),然后使用这两个流的读写操作完成与服务端的数据交互
     */
    private Socket socket;

    /**
     * 构造方法,用来初始化客户端
     */
    public Client() {
        /**
         * 实例化Socket时,通常需要传入两个参数:
         * 参数1:服务端的地址信息(IP地址,如果连接本机则可用localhost)
         * 参数2:服务端打开的服务端口,即:服务端ServerSocket申请的端口
         *
         * socket实例化的过程就是连接服务端的过程,
         * 如果指定的地址与服务端口对应的服务端没有启动,或者输入信息有误就会导致无法连接
         *
         * 会抛出异常提示拒绝连接:Connection refused: connect
         * 注意:导致这个问题还有一种情况,服务端机器没有关闭防火墙
         *
         */
        try {
            System.out.println("正在连接服务端...");
            //Socket 创建的过程,就是连接的过程
            socket = new Socket("localhost",8088);
            System.out.println("与服务端成功建立连接...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端开始工作的方法
     */
    public void  start(){
        //客户端启动后,先启动一个线程,用于读取服务端发送过来的消息
        Runnable sh = new ServerHandler();
        Thread thread = new Thread(sh);
        thread.start();

        /*
         *Socket 提供方法:
         * OutputStream  getOutputStream()
         * 该方法会获取一个字节输出流,通过这个输出流写出的字节数据会通过网络发送给对方
         */
        try(
            /*
                Socket提供的方法:
                OutputStream getOutputStream()
                该方法会获取一个字节输出流,通过这个输出流写出的字节数据会通过网络
                发送给对方。
             */
                OutputStream out = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(//高级流,按行写ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值