聊天程序(基于Socket、Thread)
聊天程序简述
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,等待客户段发来的信息。

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

问题2:代码中sck.Listen(10);设置监听序列,这里设置为10是不是,服务端只能处理10个客户段的请求呢。
答:不是的这里设置的是一次性只能处理10个,如果还有更多就在后面排队,等待这10个处理完成,接下来在处理排着对的信息。
开启服务监听看一下我们的聊天界面:

然后我们再做一个客户端,链接到服务端。
创建客户端链接服务端的Socket———聊天程序(Socket、Thread)
如果链接服务端的聊天程序则需要知道服务端的Ip地址,端口号。

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

链接成功后,下一步,我们就开始我们的聊天信息接收发送了。
服务端向客户端发送信息,客户端接受信息———聊天程序(Socket、Thread)
1、这里我们发送消息是通过Tcp协议以 字节数组的类型形式发送,所以在发送之前我们需要把要发送,接收的数据做一个转换为字节数组的类型。
2、客户端通过创建的链接服务端的Socket的Receive方法接收消息,服务端通过创建的接受客户端信息的Socket的Send方法发送消息。
服务端代码:

客户端代码:

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

接下来做客户端向服务端发送消息:
客户端向服务端发送信息(文件,字符串),客户端接受信息———聊天程序(Socket、Thread)
1、这里我们发送不仅只有字符串还有文件。他们都是一字节数组的类型发送出去,区别字符串和文件的思想是:把字节数组的第一个值设置为0跟1,用来区分。
2、这里发送的文件接受的时候,重命名,还要为他写上后缀名。没有深入写。
3、这里客户端连接服务端的成功后,把客户端的ip端口号,写入list列表中,同时也存入Dictionary<string, Socket> socketDir集合中,便于服务端与多个客户端连接时,选择发送信息。同时也避免了,不知道发送给哪个客户端数据。
客户端代码:

服务端代码:

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

总结:剩余一个群发,我没写上去,相信你如果看明白了上面我所写的的话,这个群发,就so easy了。再次友情提醒一下,如果你不懂多线程,我的上一篇博客就是对他的浅解 。链接地址------->>“ 浅解多线程 ” 。
聊天程序(基于Socket、Thread)的更多相关文章
- 聊天程序——基于Socket、Thread (二)
聊天程序简述 1.目的:主要是为了阐述Socket,以及应用多线程,本文侧重Socket相关网路编程的阐述.如果您对多线程不了解,大家可以看下我的上一篇博文浅解多线程 . 2.功能:此聊天程序功能实现 ...
- 你也可以写个聊天程序 - C# Socket学习1
原文:你也可以写个聊天程序 - C# Socket学习1 简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单 ...
- 你也可以写聊天程序 - C# Socket学习1
简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单的聊天程序. 一些基础类 首先我们每天打开浏览器访问网页信 ...
- python 聊天程序(基于UDP)
from threading import Thread from socket import * updSocket = socket(AF_INET,SOCK_DGRAM) updSocket.b ...
- 利用TCP协议,实现基于Socket的小聊天程序(初级版)
TCP TCP (Transmission Control Protocol)属于传输层协议.其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送.可靠性.有效流控.全双工操作和多路复用 ...
- Android IPC机制(五)用Socket实现跨进程聊天程序
1.Socket简介 Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...
- 通过编写聊天程序来熟悉python中多线程及socket的用法
1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
随机推荐
- Sublime Text3括号配对与代码包围效果BracketHighlighter
就这么看json等配置文件,太难了,我们需要括号匹配插件BracketHighlighter,但是装完以后只有下划线提示不明显,需要配置 Bracket Settings-Default 文件 ...
- UVA 10735 Euler Circuit (最大流)
题意:求混合图的欧拉路径. 一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向. 分析: 这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边. ...
- 带二级目录的Nginx配置------目前找到的最简单的方法
由于项目不知一个,所以不得不为每一个项目建一个专有的文件夹,这就导致了在配置nginx的时候会出现二级目录 目前找到的最简单的方法 - step1:修改 vue.config.js 添加配 ...
- v-if与v-show的区别与选择
v-if与v-show的区别与选择 官网给的区别 v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if也是惰性的:如果在初始渲染时条件 ...
- Workrave怎么用 Workrave使用方法, Workrave 健康计时器,预防电脑长期操作的职业病伤害
下载绿色版: https://portableapps.com/apps/utilities/workrave_portable 选择阅读模式: 中文: 可以只选择启动休息的计时器,这样其他2个就不用 ...
- Python基础篇 -- 列表
3.2 列表的增删改查 列表使用 [] 来表示,列表中每个元素与元素之间用逗号隔开 列表也有索引和切片 # 切片切出来的也是列表 lst = ["梅西", "内马 ...
- synchronized 和ReentrantLock的区别
历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了 ReetrantLock (再入锁) 1.位于java.util.concurrnt.lock ...
- 拼凑json的实例
一,拼凑 json 串 并传到后台 function writeToJson(num){ var i = 1; var jsonData = "["; for(i=1;i< ...
- shell基础笔记1
---恢复内容开始--- 1 test命令中不能使用浮点小数值,如: A=1.444444:[ $A -gt 1 ] 2 test命令中的>或<必须转义,否则shell会把它 ...
- 【树状数组 思维题】luoguP3616 富金森林公园
树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...