Socket 多人聊天室的实现 (含前后端源码讲解)(一)

近期工作在小程序、网页中使用了WebSocket,浏览了各个公司对Android人才需求条件中有着要求使用过WebSoket、Socket的条件,便想着在Android上使用Socket来实现聊天室的功能。于是,这篇文章诞生了。

Socket 多人聊天室的实现系列文章:

关于Socket

  • 简介
    Socket,又称套接字,在TCP/IP协议分层架构中,属应用层和传输层之间的一个抽象层(也有的说是属于传输层),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

在这里插入图片描述

  • 优点
    1、传输数据时间短,性能高
    2、可以加密,数据安全性强
    3、适合客户端和服务器端之间信息实时交互
    4、传输数据为字节级,传输数据可自定义,数据量小
  • 缺点
    1、相对于http协议传输,增加了开发量

建立连接

在这里插入图片描述

服务端

1.创建Socket,bind()绑定地址,listen()监听套接字

ServerSocket只需要一行代码就可以完成创建、绑定、监听Socket,绑定的地址没填默认就是本机的ip(在源码中InetAddress.anyLocalAddress()方法得出的结论),监听Socket监听的是改Socket的最大连接数,如果队列满时,会出现提示,并拒绝连接(源码的listen(int backlog)方法这样解释)。

ServerSocket server = new ServerSocket(端口号);
2.accept()监听连接

accept()方法侦听要与ServerSocket建立的连接并接受它。该方法会阻塞,直到建立连接。

server.accept();
3.read()读数据

accept()方法连接成功,会返回Socket对象,通过这一个对象,我们可以实现与客户端的互动,互动的过程涉及到对Socket的writeread,还是建议创建一个线程池,在线程中对Socket的writeread进行操作。

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), Config.TRANSFER_MESSAGE_CHARSET_NAME));
try {
	String receiveMsg = null;
    while (true) {
        // 循环接收、读取客户端发送过来的信息
        if ((receiveMsg = reader.readLine()) != null) {
            // receiveMsg 接收到的消息
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

在上面的代码中,使用while开启一个死循环,这时候可千万不要理解为这串代码一直在执行着while循环判断receiveMsg 是否为nullreadLine()方法里,有一个地方会执行到一个read(char cbuf[], int off, int len)方法,源码是这样介绍这个方法的:

Reads characters into a portion of an array. This method will block until some input is available, an I/O error occurs, or the end of the stream is reached
将字符读入数组的一部分。此方法将阻塞,直到某些输入可用、发生 IO 错误或到达流末尾

因此,readLine()没有接收到字符,会被readLine()方法里面的read(char cbuf[], int off, int len)方法阻塞,直到接收到字符,继续往下执行,执行完,重新开始while循环。

4.write()写数据

PrintWriter(Writer out,boolean autoFlush)构造方法autoFlush参数用于设置是否自动冲洗(自动发送消息给客户端),如果设为false,调用println(String x)方法后还需要再调用flush()方法才可实现推送消息给客户端,设置为true,直接调用println(String x)方法即可实现将数据写入并发送给用户端.

PrintWriter printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Config.TRANSFER_MESSAGE_CHARSET_NAME)), true);
printWriter.println(String x);
5.close()关闭连接

关闭连接,也要顺带把与用户的Socket连接也给关闭掉

// 方法一:
socket.close(); // 关闭指定客户端的连接
reader.close(); // 关闭阅读器
server.close(); // 关闭ServerSocket
// 方法二:
// 接收客户端的消息,如果消息为约定好的断开连接的消息,则断开连接

客户端

1. 创建Socket、connect()连接Socket

在Android,访问网络都需要加上网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>

客户端创建Socket,new Socket(String host, int port);需要抛出异常,当IP地址错误、端口号错误、服务器ServerSocket未启动时,都会抛出异常,即连接失败。

try {
	Socket socket = new Socket(String host, int port);
} catch (Exception e) {}
2. write()写数据

同服务器的write()用法

3. read()读数据

同服务器的read()用法

4. close()关闭连接
// 方法一:
socket.close();
// 方法二:
// 给服务器发送相关消息,由服务器断开与指定客户端的连接

效果图

在这里插入图片描述


点击前往下载Socket 多人聊天室的实现 (含前后端源码详解)(一)源码


参考文档:
网络分层架构(七/四层协议)
Android:这是一份很详细的Socket使用攻略

  • 10
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言和Socket可以实现多人聊天室。 在C语言中,可以使用Socket编程来实现网络通信功能。Socket是一种网络通信的API,可以通过创建套接字(socket)来进行数据传输和通信。 实现多人聊天室的主要步骤如下: 1. 创建服务器端程序:首先,需要创建一个服务器端程序,用于接收和处理客户端的连接请求。服务器端程序可以创建一个套接字,并进行绑定、监听等操作,用于等待客户端的连接请求。 2. 创建客户端程序:然后,需要创建多个客户端程序,用于连接服务器并进行聊天客户端程序可以通过创建套接字,并与服务器端建立连接,然后进行聊天和数据交换。 3. 客户端与服务器端的通信:一旦客户端和服务器端建立了连接,它们就可以通过套接字进行数据的传输和通信。客户端可以向服务器发送消息,服务器可以接收并处理这些消息,然后将消息转发给其他客户端。 4. 多人聊天实现:为了实现多人聊天功能,服务器端需要维护一个客户端列表,用于存储连接到服务器的所有客户端。当某个客户端发送消息时,服务器可以将消息发送给所有其他客户端,从而实现多人聊天的效果。客户端也可以接收其他客户端发送的消息,并进行展示。 总结来说,使用C语言和Socket编程可以实现多人聊天室。服务器端负责接收和处理连接请求,并转发消息给其他客户端客户端负责连接服务器,并发送、接收和展示消息。这样就可以实现多个用户之间的实时聊天
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宾有为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值