聊天程序(基于socketthread)

赵弘添 赵弘添     2022-08-30     284

关键词:

聊天程序简述


1、目的:主要是为了阐述Socket,以及应用多线程,本文侧重Socket相关网路编程的阐述。如果您对多线程不了解,大家可以看下我的上一篇博文浅解多线程 。

2、功能:此聊天程序功能实现了服务端跟多个客户端之间的聊天,可以群发消息,选择ip发消息,客户端向服务端发送文件。 (例子为WinForm应用程序)


Socket,端口,Tcp,UDP。 概念


 1、Socket还被称作“套接字”,应用程序通常通过套接字向网络发送请求或者应答网络请求。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

2、端口:可以认为是计算机与外界通讯交流的出口。

3、Tcp: TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议。UDP是另一个重要的传输协议。

4、UDP:用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。


理解Socket,端口,Tcp,UDP


1、ip跟端口的作用:例如,你用QQ跟好友聊天,首先QQ要知根据好友所在电脑的IP地址发送信息,ip地址能确定好友的所在的电脑,但是不知道好友电脑上的QQ应用程序是哪一个,这就需要QQ提供一个端口号来确定你发过来的信息是QQ接受的数据。这样就简单的阐述了Ip跟端口的作用。

2、Tcp,Udp作用以及差异:首先要说的是,这是两种网路协议,他们的差别就是TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。我们.net程序员一般的应用程序用的都是Tcp协议。但是Tcp协议的执行速度,效率不及Udp快。看别人的博客感觉图解这两个协议,显得更直观点。上图:

3、Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。出自同一篇博客的图。

4、到这里如果你对Socket,还不是很清楚透彻,那么在接下来的聊天程序代码中,我还会一点点的阐述。


 创建服务端监听功能———聊天程序(Socket、Thread)


服务端监听服务是创建一个Socket等待接收客户端的信息。这个需要绑定服务端的Ip、端口号,以便于客户端发送请求的时候找准确服务端聊天程序的具体位置。此外这个Socket还需要设置监听序列的大小,告知应用程序一次性最多处理客户端发来信息的多少。然后创建一个接收客户端通信的Socket,等待客户段发来的信息。

View Code

 

问题1:代码中的Socket accSck = sck.Accept();这个Socket是让上一个绑定服务端ip端口号的Socket一直处于等待接受客户端发送信息的状态,所以一直占用应用程序一直默认开启的Ui线程,致使点击开启服务监听后,界面无响应。

解决办法:使用多线程,我们在这里写一个自己的线程让这里的监听服务,写在自己的线程里面。修改代码如下:

View Code

问题2:代码中sck.Listen(10);设置监听序列,这里设置为10是不是,服务端只能处理10个客户段的请求呢。

答:不是的这里设置的是一次性只能处理10个,如果还有更多就在后面排队,等待这10个处理完成,接下来在处理排着对的信息。

开启服务监听看一下我们的聊天界面:

然后我们再做一个客户端,链接到服务端。


创建客户端链接服务端的Socket———聊天程序(Socket、Thread)


如果链接服务端的聊天程序则需要知道服务端的Ip地址,端口号。

View Code

然后点击连接服务,查看我们的聊天界面。(首先先打开服务端应用程序,点击开启监听,然后打开客户端应用程序,点击链接服务)

链接成功后,下一步,我们就开始我们的聊天信息接收发送了。


服务端向客户端发送信息,客户端接受信息———聊天程序(Socket、Thread)


1、这里我们发送消息是通过Tcp协议以 字节数组的类型形式发送,所以在发送之前我们需要把要发送,接收的数据做一个转换为字节数组的类型。

2、客户端通过创建的链接服务端的Socket的Receive方法接收消息,服务端通过创建的接受客户端信息的Socket的Send方法发送消息。

服务端代码:

View Code

客户端代码:

View Code

启动服务端应用程序,点击启动服务监听,启动客户端应用程序,点击连接服务,然后在消息框内输入消息,点击发送。运行效果如下。


 

 接下来做客户端向服务端发送消息:


 客户端向服务端发送信息(文件,字符串),客户端接受信息———聊天程序(Socket、Thread)


1、这里我们发送不仅只有字符串还有文件。他们都是一字节数组的类型发送出去,区别字符串和文件的思想是:把字节数组的第一个值设置为0跟1,用来区分。

2、这里发送的文件接受的时候,重命名,还要为他写上后缀名。没有深入写。

3、这里客户端连接服务端的成功后,把客户端的ip端口号,写入list列表中,同时也存入Dictionary<string, Socket> socketDir集合中,便于服务端与多个客户端连接时,选择发送信息。同时也避免了,不知道发送给哪个客户端数据。

客户端代码:

View Code

服务端代码:

View Code

启动服务端应用程序,点击启动服务监听,可以同时启动多个客户端应用程序,都要先点击连接服务,然后在消息框内输入消息,也可以选取文件,点击发送。运行效果如下。



 总结:剩余一个群发,我没写上去,相信你如果看明白了上面我所写的的话,这个群发,就so easy了。再次友情提醒一下,如果你不懂多线程,我的上一篇博客就是对他的浅解 。链接地址------->>“ 浅解多线程 ” 。

基于 Android 的实时聊天应用程序

】基于Android的实时聊天应用程序【英文标题】:Androidbasedlivechatapplication【发布时间】:2015-09-0904:24:25【问题描述】:我正在开发基于android的实时聊天应用程序。目前我正在使用quickbloxapi。有没有更好的api可用,如果它得到良好... 查看详情

基于udp协议的控制台聊天程序

一、聊天程序的功能   1.能够登录账号、注册新账号   2.能够进行群聊   3.能够进行私聊   注:该程序对传统的聊天程序进行了简化:       1.服务器中只有一... 查看详情

微信小程序|基于小程序+c#制作一个聊天系统(代码片段)

此文主要基于小程序+C#使用WebSocket制作一个聊天系统,基本实现小程序与服务端的聊天功能。用小程序自带的客服功能只能绑定微信且一对一沟通,接入市面上成熟的即时通讯预算又略显不足,干脆自己开发一个... 查看详情

在基于 aws appsync 的聊天应用程序中显示在线用户

】在基于awsappsync的聊天应用程序中显示在线用户【英文标题】:DisplayOnlineusersinawsappsyncbasedchatapplication【发布时间】:2019-12-1420:14:13【问题描述】:我使用AWSAppsync创建了一个聊天应用程序。我的问题是我无法识别在线和离线用... 查看详情

基于多进程的网络聊天程序

參考:linux高性能server编程。作者:游双程序简单介绍:该程序用了共享内存来实现进程间的同步,因为仅仅是同一时候读取共享内存。所以没实用到锁。该程序的功能是server监听网络连接,当有一个client连接时,server创建一个... 查看详情

基于java实现hello/hi简单网络聊天程序

目录Socket简要阐述Socket的概念Socket原理hello/hi的简单网络聊天程序实现服务器端客户端程序执行结果跟踪分析调用栈&LinuxAPI对比创建ServerSocket调用栈图示源码分析Socket绑定调用栈图示源码分析Socket监听调用栈图示源码分析Socket... 查看详情

网络协议分析课程设计:基于tcp协议网上聊天程序

...程设计报告。急需!先谢过各位大触了!基于TCP协议网上聊天程序有的参考技术A写作攻略网上很多。说实话一下是教不会的。多查阅资料。或帮你处理。 参考技术B以前弄过一个不过,硬盘坏了就丢失了。无能为力了。 查看详情

基于java套接字的简单网络聊天程序

网络中进程之间如何通信本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程... 查看详情

基于uni-app多端「h5+小程序+app」高仿抖音小视频|直播|聊天实例(代码片段)

uni-ttLive基于uni-app+uView-ui跨端开发短视频+直播聊天实例。全新研发的一款多端仿制抖音短视频+直播+聊天项目,基于uniApp+Vue.js+Vuex+Nvue+uViewUI+uaPopup等技术开发而成。支持播放/暂停/上下滑动切换、全... 查看详情

java案例:基于tcp的简单聊天程序(代码片段)

文章目录一、如何实现TCP通信二、编写C/S架构聊天程序(一)编写服务器端程序-Server.java(二)编写客户端程序-Client.java(三)测试服务器端与客户端能否通信(四)程序优化思路-服务器端采用多... 查看详情

[iphone高级]基于xmpp的ios聊天客户端程序(ios端一)

介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载点ZIP下载 接下来,用Xcode新建一个工程 将以下这些文件拖入新建工程中 ... 查看详情

基于python完成一个hello/hi的简单的网络聊天程序(代码片段)

一、Socket套接字简介套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网... 查看详情

基于socket的android聊天室(代码片段)

1    基于Socket的Android聊天室Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序。本实例使用ServerSocket建立聊天服务器... 查看详情

基于java版聊天室的设计

本聊天系统利用Java中的socket网络编程和多线程技术实现。主要包括登陆连接、服务器管理、客户聊天三大功能。管理员和用户经过登陆界面分别进入到服务器端和客户端,客户通过socket连接服务器,服务器通过多线程技... 查看详情

基于小程序制作一个chatgpt聊天机器人(代码片段)

...xff0c;将ChatGPT与实战开发相结合,制作一个随身携带的聊天机器人,紧贴前沿的同时稳固基础。一、前言1.1、什么是ChatGPT1.2、什么是文本完成二、API2.1、ChatGPT官网申请API所需要的key2.2、搭建API2.3、创建控制器及动作方法... 查看详情

Socket.io 是聊天模块的理想选择吗

】Socket.io是聊天模块的理想选择吗【英文标题】:IsSocket.ioIdealforchatmodule【发布时间】:2017-08-3013:05:01【问题描述】:我正在开发基于Angularjs和Node.js的应用程序。这是一个基于组织的应用程序。在这个应用程序中,我必须实现聊... 查看详情

基于微信小程序的聊天系统的设计与实现.rar(论文+程序源码+附件1任务书+开题报告)

目录1 绪 论41.1 项目的背景和意义41.2 国内外研究现状和发展趋势51.3 主要内容52 需求分析与实施方案62.1 需求分析的目标62.2 可行性分析62.2.1 技术可行性62.2.2 操作可行性62.3 功能需求分析62.4 开发环境72.5 实施... 查看详情

Cocoa 中基于 Jabber 的服务器和客户端应用程序

...1-1311:21:51【问题描述】:我已经实现了一个当前支持文本聊天的应用程序。现在我想在其中实现语音聊天和稍后的视频聊天,但客户提供的时间较少。:(所以我打算在Cocoa中使用一些开源代码,我可以使用这些代码并轻松地将其... 查看详情