前几天开始学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聊天室的更多相关文章

  1. WinForm版聊天室复习Socket通信

    聊天室:服务器端-------------客户端 最终演示展示图: 一. 服务器端 对服务端为了让主窗体后台不处理具体业务逻辑,因此对服务端进行了封装,专门用来处理某个客户端通信的过程. 而由于通信管 ...

  2. C# 异步通信 网络聊天程序开发 局域网聊天室开发

    Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...

  3. SharedObject对象聊天室

    本博推荐文章快速导航: Sql Server2005 Transact-SQL 新兵器学习MCAD学习 代码阅读总结 ASP.NET状态管理 DB(数据库)WAPWinFormFlex,Fms aie ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. 使用Service Bus Topic 实现简单的聊天室

    创建Service Bus能够參照: https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-t ...

  6. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  7. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  8. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  9. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

随机推荐

  1. css3划过图片闪光

    css代码 01 .img { display:block; position: relative; width:800px; height:450px; margin:0 auto;} 02 .im ...

  2. 跟我学SpringMVC目录汇总贴、PDF下载、源码下载

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. 【02】尽量以const,enum,inline替换#define

    1.考虑为什么? 首先,#define不是语言的一部分,而是预编译过程.也就是在编译器编译之前,进行文本替换.考虑#define Pi 3.1425:在编译之前,Pi都会被文本替换为3.1415,因此 ...

  4. Android开发环境搭建(windows OS)之补充

    这几天搭建了个安卓开发环境,也想玩玩安卓开发.在查询CSDN,CNBLOG,视频网站之后终于把开发环境搭建起来了,发现所有的指导都比较离散,比如有些只说安装方法,有些只说下载方法.本文来个集大成,算是 ...

  5. mysqld --debug-sync

    http://hedengcheng.com/?p=238https://dev.mysql.com/doc/internals/en/debug-sync-facility.html mysqld ...

  6. 详解QUiLoader 动态加载.ui文件

    http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...

  7. 玩转Android之二维码生成与识别

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...

  8. css所有选择器的详解

    ----------------------------------------css 选择器---------------------------------------- 1,组合选择器: 1)e ...

  9. java与.net平台之间进行RSA加密验证

    RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说java与.net平台之间该如何进行RSA加密验证,即java端加密->.net端验证和.net端加密 ...

  10. 从入行到现在(.net)

    每次写东西都不知道怎么去开头.因为一想到要写东西.脑子里面浮现出来的开头就太多. 进园子很久从开始只是关注别人讲的技术,别人讲的基础,到现在更多的去看大家的随笔和新闻.这两年我从零基础的外行人逐渐进入 ...