WinForm聊天室
前几天开始学Socket编程,跟着老师一点一点的做。最后做了一个WinForm版的小聊天室。这个聊天室的客户端和服务端都只是在本机上运行。
这里我首先和大家谈谈我对聊天室的一点理解,聊天室其实是服务端分配一个端口,开启一个一直监听有没有客户端来连接服务器的Socket,
如果一台客户端要去连接这台服务器,那么就会分配一个通信用的Socket并知道这台服务器的IP和端口号,去向服务器发出连接请求,
如果服务器的监听Socket监听到有一台客户端发出连接请求,那么服务器监听Socket就会创建一个新的Socket,也称连接Socket来和
客户端进行连接通信。
下面上服务端开始监听Socket的代码:
- //监听Socket
- private void btnStart_Click(object sender, EventArgs e)
- {
- //ip地址
- IPAddress ip = IPAddress.Parse(txtServer.Text);
- //IP地址和端口号
- IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
- //创建监听Socket
- Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //绑定IP和端口号
- socket.Bind(point);
- ////通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
- ////开启监听Socket 监听队列的长度
- socket.Listen(10);
- btnStart.Enabled = false;
- ShowMsg("开始监听...");
- //监听端口号,如果有客户端连接,创建新的Socket用于通信
- //Socket connSocket = socket.Accept();
- Thread t = new Thread(Listen);
- t.IsBackground = true;
- t.Start(socket);
- }
服务端监听客户端连接请求代码:
- Socket socket = obj as Socket;
- //这样可以不断的监听客户端发送的连接请求
- while (true){
- //通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
- //监听端口号,如果有客户端连接,创建新的Socket用于通信
- //socket.Accept();会阻塞窗体的运行
- Socket connSocket = socket.Accept();
- //当前连接的客户端IP和端口号
- string ipport=connSocket.RemoteEndPoint.ToString();
- //连接的客户端IP和端口号显示在下拉框中
- cmbClient.Items.Add(ipport);
- //将连接的客户端IP、端口号和Socket存储Dictionary中
- dic.Add(ipport, connSocket);
- //本机IP和端口号
- //connSocket.LocalEndPoint
- ShowMsg(connSocket.RemoteEndPoint.ToString());
- Thread t = new Thread(ReceiveMsg);
- t.IsBackground = true;
- t.Start(connSocket);
- }
客户端Socket代码:
- //客户端连接服务器的IP
- IPAddress ip = IPAddress.Parse(txtServer.Text);
- //客户端连接服务器的IP和端口号
- IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
- try {
- //创建通信连接的Socket
- socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- socket.Connect(point);
- ShowMsg("连接成功");
- }
- catch(Exception ex) {
- ShowMsg(ex.Message);
- }
- //接收消息
- Thread t = new Thread(Receive);
- t.IsBackground = true;
- t.Start();
由于代码比较多,这里就不一一贴上所有代码
WinForm聊天室的更多相关文章
- WinForm版聊天室复习Socket通信
聊天室:服务器端-------------客户端 最终演示展示图: 一. 服务器端 对服务端为了让主窗体后台不处理具体业务逻辑,因此对服务端进行了封装,专门用来处理某个客户端通信的过程. 而由于通信管 ...
- C# 异步通信 网络聊天程序开发 局域网聊天室开发
Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...
- SharedObject对象聊天室
本博推荐文章快速导航: Sql Server2005 Transact-SQL 新兵器学习MCAD学习 代码阅读总结 ASP.NET状态管理 DB(数据库)WAPWinFormFlex,Fms aie ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 使用Service Bus Topic 实现简单的聊天室
创建Service Bus能够參照: https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-t ...
- 史上最全面的SignalR系列教程-6、SignalR 实现聊天室
1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- 基于select的python聊天室程序
python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...
随机推荐
- var_dump() 打印数组不完整 解决办法
我们用var_dump() 打印数组, 一般会出现这种情况, 就是打印出来的数组不完整 ,会有省略号. 解决方法: 在php.ini里的xdebug节点中,加入如下 xdebug.var_displa ...
- JAVA调用操作javascript (JS)工具类
import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import ...
- MySQL bug:server-id默认被自己主动置为1
昨天同事在做主从时,从库报例如以下错误: Got fatal error 1236 from master when reading data from binary log: 'Misconfigu ...
- JS正则表达式验证表单
一.解释一些符号相关的意义 1. /^$/ 这个是个通用的格式. ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 2. 里面输入需要实现的功能. ...
- 20 个强大的 Sublime Text 插件
20. FTPSync 默认情况下SublimeText不具备FTP的功能,如果你正在寻找能在您的SublimeText应用程序中使用的免费和易用的FTP工具,你可以考虑FTPSync.这是一个非常简 ...
- arcgis10 安装1721错误
arcgis10 安装1721错误,主要是ArcGIS License Manager 服务程序的位置不对,注册表lmgrd.exe中修改lmgrd.ex
- msql 按值排序
ORDER BY find_in_set(status,'705,710,706,1027,707,709,708'),create_time desc
- Smokeping 监控部署及配置
安装参见: https://github.com/oetiker/SmokePing/blob/master/doc/smokeping_install.pod 1 Smokeping *** Gen ...
- StringBuffer与StringBuilder之间的区别
public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringBuff ...
- Java并发(6)带返回结果的任务执行
携带结果的任务 JDK5提供了有可返回值的任务的执行.java.util.concurrent中Callable与Futrue用以实现带返回值的任务执行. 使用Callable与Futrue与使用Ru ...