zoukankan      html  css  js  c++  java
  • Socket接口原理及C#实现

    Socket原理:服务端有一个进程(或者多个进程)在指定端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。客户端在需要的时刻发出向服务器端的连接请求。
    在使用TCP协议时,一般服务端进程先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。之后,服务端使用listen调用指出等待服务请求队列的长度。然后就可以使用accept调用等待客户端发起连接,一般是阻塞等待连接,一旦有客户端发出连接,accept返回客户的地址信息,并返回一个新的socket描述符,该描述符与原先的socket有相同的特性,这时服务端就可以使用这个新的socket进行读写操作了。一般服务端可能在accept返回后创建一个新的进程进行与客户的通信,父进程则再到accept调用处等待另一个连接。客户端进程一般先使用socket调用得到一个socket描述符,然后使用connect向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过socket描述符进行读写操作了。

        例子
    /*
     * Client
     
    */

    using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;

    namespace Client
    {
        
    class Client
        
    {
            
    static void Main(string[] args)
            
    {
                
    try
                
    {
                    
    int port = 2000;
                    
    string host = "127.0.0.1";
                    IPAddress ip 
    = IPAddress.Parse(host);
                    IPEndPoint ipe 
    = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
                    Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                    Console.WriteLine("Conneting");
                    c.Connect(ipe);
    //连接到服务器
                    string sendStr = "hello!This is a socket test";
                    
    byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                    Console.WriteLine(
    "Send Message");
                    c.Send(bs, bs.Length, 
    0);//发送测试信息
                    string recvStr = "";
                    
    byte[] recvBytes = new byte[1024];
                    
    int bytes;
                    bytes 
    = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                    Console.WriteLine(
    "Client Get Message:{0}", recvStr);//显示服务器返回信息
                    c.Close();
                }

                
    catch (ArgumentNullException e)
                
    {
                    Console.WriteLine(
    "ArgumentNullException: {0}", e);
                }

                
    catch (SocketException e)
                
    {
                    Console.WriteLine(
    "SocketException: {0}", e);
                }

                Console.WriteLine(
    "Press Enter to Exit");
                Console.ReadLine();

            }

        }

    }

    /*
     * Server
     
    */
     
    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;

    namespace Server
    {
        
    class Server
        
    {
            
    static void Main(string[] args)
            
    {
                
    try
                
    {
                    
    int port = 2000;
                    
    string host = "127.0.0.1";
                    IPAddress ip 
    = IPAddress.Parse(host);
                    IPEndPoint ipe 
    = new IPEndPoint(ip, port);
                    Socket s 
    = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
                    s.Bind(ipe);//绑定2000端口
                    s.Listen(0);//开始监听
                    Console.WriteLine("Wait for connect");
                    Socket temp 
    = s.Accept();//为新建连接创建新的Socket。
                    Console.WriteLine("Get a connect");
                    
    string recvStr = "";
                    
    byte[] recvBytes = new byte[1024];
                    
    int bytes;
                    bytes 
    = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                    Console.WriteLine(
    "Server Get Message:{0}", recvStr);//把客户端传来的信息显示出来
                    string sendStr = "Ok!Client Send Message Sucessful!";
                    
    byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                    temp.Send(bs, bs.Length, 
    0);//返回客户端成功信息
                    temp.Close();
                    s.Close();
                }

                
    catch (ArgumentNullException e)
                
    {
                    Console.WriteLine(
    "ArgumentNullException: {0}", e);
                }

                
    catch (SocketException e)
                
    {
                    Console.WriteLine(
    "SocketException: {0}", e);
                }

                Console.WriteLine(
    "Press Enter to Exit");
                Console.ReadLine();

            }

        }

    }
  • 相关阅读:
    Enterprise Library 4.1 Data Access Block 快速使用图文笔记
    敏捷开发(名字起得很帅,很忽悠人)原则 括号里面加了自己的理解笔记
    与弟弟谈话的摘要
    练习:选头像控件
    [转]保护你的flash(as3)程序基于socket方式传送swf文件
    Silverlight 又多了一套skin
    Silverlight制作逐帧动画
    Silverlight Spy 2 源代码查看器
    跨平台开发silverlight
    Silverlight 2 搜索照片 Live
  • 原文地址:https://www.cnblogs.com/jinweida/p/1145195.html
Copyright © 2011-2022 走看看