Socket介绍和使用方法



-Socket是网络编程中很重要的部分,是客户端和服务端之间建立连接的途径,Socket有两个部分,一个害死服务端,一个是客户端,举个例子,聊天室啊,类似于QQ的啊,都是差不多这个,也有可能不同,这就是腾讯那边的了,好了,我们.NET就用的Socket

服务器端:
    申请一个Socket
    绑定到一个IP地址和一个端口上
    开启监听,等待接受连接
客户端:
    申请一个Socket
    连接服务器(指明IP地址和端口号)
服务器端接到连接请求后,产生一个新的Socket(端口 大于1024)与客户端建立连接并进行通讯,原侦听Socket继续侦听


Socket连接通过构造函数完成
public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType)
    AddressFamily 成员是指Socket用来解析地址的寻址方案,例如:InterNetwork指示当Socket使用一个IP版本4地址连接
    SocketType定义要打开的Socket的类型
    Socket类使用ProtocolType枚举向Windows Sockets API通知所请求的协议
如:mySocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)


相关类
    IPAddress类:包含了一个IP地址
    IPEndPoint类:包含了一对IP地址的端口号
方法们
Socket():创建一个Socket
Bind():绑定一个本地的IP和端口号(IPEndPoint)
Listen():让Socket侦听传入的连接尝试,并指定侦听队列容量
Connect();初始化与另一个Socket的连接
Accept():接收连接并返回一个新的Socket
Send():输出数据到Socket
Receive():从Socket中读取数据
Close();关闭Socket(销毁连接)

因为这个实例比较大,所以,请参考----http://pan.baidu.com/share/link?shareid=4038235898&uk=2837994235

这里我说到一个很多人遇到的问题,如果,向服务器发送文件,服务器那边假如需要弹出对话框来保存文件,可是无论如何都弹不出对话框怎么办?这就是因为Socket中,用了线程的缘故(本人自己的观点),解决办法:在监听客户端请求的地方,托管了线程,加上  threadClient.SetApartmentState(ApartmentState.STA);这么一句就行了

例如:

  void WatchConnetion()
        {
            while (true)//持续不断的监听新的客户端连接请求
            {
                //接受处理,执行接收数据方法,创建负责通信的套接字
                //开始监听 客户端连接请求,注意:Accept方法,会阻断当前的进程,所以啊,来一个多线程
                Socket socketConnection = Socketwatch.Accept();//一旦监听到客户端的请求,
                //就返回一个负责和该客户端通信的套接字SocketConnetion
                //向列表控件中添加一个客户端IP和端口字符串,作为客户端唯一标识
              lbOnline.Items.Add(socketConnection.RemoteEndPoint.ToString());
            //将与客户端通信的套接字对象SocketConnetion添加到键值对集合中,并以客户端IP端口作为键

              dictionary.Add(socketConnection.RemoteEndPoint.ToString(),socketConnection);
           //创建通信线程
                Thread threadClient=new Thread(RecMsg);
                threadClient.IsBackground=true;
                threadClient.SetApartmentState(ApartmentState.STA);//这么一句,就可以了
                threadClient.Start(socketConnection);
                dictionaryThread.Add(socketConnection.RemoteEndPoint.ToString(),threadClient);//加到集合中
                ShowMsg("客户端连接成功!" + socketConnection.RemoteEndPoint.ToString());//socketConnection.RemoteEndPoint.ToString()是IP地址和端口
            }
        }
        
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值