一个简易的SocketIM

今天做了一个简易的socketIM的小示例。基本思想是开启两个winform,每个winform既充当服务器也充当客户端。一个监听8000端口,另外一个监听8001端口,两个winform接收到信息之后将信息显示在form的控件上。

 

这篇记录一下码code中学到的一些东西。

1 System.Net.Sockets的使用

.net的socket库已经将C中对socket的所有使用封装起来了。庆幸的是基本的函数和流程还是一样的。

 

想要创建socket server,步骤如下:

 

实例化一个socket

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

绑定端口

socket.Bind(endpoint);

监听端口

socket.Listen(5);

Accept请求

Socket clientSocket = socket.Accept();

接收请求内容

clientSocket.Receive(byteMessage);

关闭socket

socket.Close();

 

创建client端,步骤如下:

实例化一个socket:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

连接到接收端

socket.Connect(endpoint);

发送请求

socket.Send(byteMessage);

关闭socket

socket.Close();

 

2 多线程操作

C#中的多线程操作函数是封装在System.Threading中。我这里是使用最简单的多线程处理函数:

 

建立一个线程处理函数,这个函数是回调用的

private void BeginListen()

实例化一个Thread,并注册回调函数

Thread thread = new Thread(new ThreadStart(BeginListen));

将线程设置为后台运行

thread.IsBackground = true;

启动线程

thread.Start();

 

3 子线程处理父线程创建的winform控件

.net中winform控件只能由创建控件的线程来操作,子线程如果要操作就需要通过代理的方式来迂回。

msdn中http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired%28v=VS.80%29.aspx是这样描述的

 

首先是Control.InvokeRequired 属性

如果当前线程对该控件没有控制权限,则这个线程调用控件的InvokeRequired返回true,说明这个线程只有调用Invoke方法才能修改控件的属性

如果当前线程对该控件有控制权限,则这个属性返回false

 

其次是Control.Invoke方法

这个方法有两个参数,第一个是方法,第二个参数是方法的参数

 

这个msdn上有个非常详细的使用例子:

http://msdn.microsoft.com/zh-cn/library/a1hetckb%28v=vs.80%29.aspx

使用这两个就可以使用这么个方法:


1

2

3

4

5

6

7

8

9

10

11

12

13

delegate void SetListBox(string strValue);                   //定义委托

       private void SetListBoxValue(string value)

        {

            if (this.listBox1.InvokeRequired)

            {

                SetListBox sbox = new SetListBox(SetListBoxValue);

                listBox1.Invoke(sbox, value);

            }

            else

            {

                listBox1.Items.Add(value);

            }

        }

处理完这三个知识点,基本就完成了。

时间: 2024-09-20 14:40:25

一个简易的SocketIM的相关文章

adodc-用ADO控件编的一个简易学生成绩管理器,运行时显示找不到可安装的ISAM,求解决

问题描述 用ADO控件编的一个简易学生成绩管理器,运行时显示找不到可安装的ISAM,求解决 Private Sub Command1_Click() On Err GoTo MyErr If Command1.Caption = "添加" Then Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = &qu

Flash8制作一个简易的图片电子相册

在这篇教程中我们将利用Flash制作一个简易的电子相册. 效果和源文件: 点击这里下载源文件(解压密码:www.webjx.com) 1.下载本教程中使用的图片,你也可以自己去准备.点击这里下载图片压缩包 2.新建立Flash文档,然后按Ctrl+J修改文档属性: 3.执行"文件">"导入">"导入到库"命令,把所有图片都导入到库里面,之后你可以按Ctrl+L查看库中是否已经有导入的图片了. 4.双击图层1改名为pictures. 5

EntityFramework之领域驱动设计实践(三):一个简易的销售系统

案例:一个简易的销售系统 从现在开始,我们将以一个简易的销售系统为例,探讨EntityFramework在领域驱动设计上的应用.为了方便讨论,我们的销售系统非常简单,不会涉及客户存在多个收货地址的情况,也不会包含任何库存管理的内容.假设我们的系统只需要维护产品类型.产品以及客户信息,并能够帮客户下订单.跟踪订单状态,以及接受客户退货.从简单的分析我们大致可以了解到,这个系统将会有如下实体:客户.单据.产品及其类型.单据分为销售订单和退货单两种,每个单据可以有多个单据行(比如销售订单行和退货单行)

java生成一个简易的计算器

下面的代码是生成一个简易的计算器. Calculator import java.awt.*; import java.awt.event.*; import javax.swing.*; class CalculatorPanel extends JPanel implements ActionListener { public CalculatorPanel() { setLayout(new BorderLayout()); display = new JTextField("0"

.NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文件系统.总的来说,它们针对的都是"本地"文件,接下来我们通过自定义FileProvider构建一个"远程"文件系统,我们可以将它视为一个只读的"云盘".由于文件系统的目录结构和文件内容都是通过HTTP请求的方式读取的,所以我们将这个自定义的FileP

注释-求大神用C语言编写一个简易的航班预订系统

问题描述 求大神用C语言编写一个简易的航班预订系统 一个小航空公司订购了一台微型计算机来运行它的航班预订系统.功能如下: 基本功能--为公司唯一的一架飞机(10个座位)的每一次飞行航班分配座位.一开始程序显示可选菜单: Please type 1 for "first class" Please type 2 for "economy" 即:乘客键入'1',程序将为他在一等舱区(座位号是1-5)分配一个座位:乘客键入'2',程序将为他在经济舱区(座位号是6-10)分

模板-C#.net如何做一个简易信息发布的网站呢?求赐教!!!!!!!!!!

问题描述 C#.net如何做一个简易信息发布的网站呢?求赐教!!!!!!!!!! .net如何做一个简易信息发布的网站呢?求赐教!!!!!!!!!! 用以c#或asp都行,有模板. 解决方案 http://download.csdn.net/detail/weixiao7019/1437956 http://download.csdn.net/detail/haozh502/1643021 解决方案二: 这类源码,网上很多的,随便搜搜吧 解决方案三: http://download.csdn.n

ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了最终一致性,也就是说当我们发帖或回帖后不会立马显示你的帖子或回复.当我们下一次刷新页面时,会显示出来.这点貌似很多人向我反馈不太习惯,接受不了,呵呵.我之所以这样做也是想看看最终一致性大家的接受程度如何,看来UI层面上的最终一致性,大部分人接受不了.回头我改进下效果,改为立即可以看到帖子或回复吧!另

java代码-我用java写了一个简易计算器的程序,但是有时候结果不正确

问题描述 我用java写了一个简易计算器的程序,但是有时候结果不正确 就是有时候计算结果后面会显示很多9或者0 ,比如计算8.3-2.1时,请问大神怎么解决啊? 我是菜菜鸟,程序如下: //Calculator.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame { private JPanel p1=new JPanel();