首页 > 程序开发 > 软件开发 > C# >

C#:Socket

2016-12-05

实例化对象:只了解了例子所用的构造方法,三个参数分别决定TCP协议各层所用的协议,方法。 大致是,如何解析地址,用什么格式的数据流,用什么协议封装数据。

实例化对象:只了解了例子所用的构造方法,三个参数分别决定TCP协议各层所用的协议,方法。 大致是,如何解析地址,用什么格式的数据流,用什么协议封装数据。

Socket

用于计算机之间的数据传输

例子

//实例化对象
Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//建立连接
sc.connect(stirng url,int port);
//发送
string str = "";
byte[] b = Encoding.ASCII.GetBytes(str);//把字符串编码为字节
sc.Send(b, b.Length, 0);//发送信息
//接收
byte[] b = new byte[1024];
sc.Receive(b, b.Length, 0);//从服务器端接受返回信息

建立连接

1.同步连接

//方法
void Connect(string url,int port);
//常见异常
ArgumentNullException:
        host 为 null
ArgumentOutOfRangeException:
        端口号无效。
ObjectDisposedException:
        Socket 已关闭。

2.异步连接

//方法
BeginConnect(string host, int port, AsyncCallback Callback, object target);
//当异步操作完成时调用回调方法
//回调方法传递target对象
//回调方法
public static void AsyncCallback(IAsyncResult ar);
//ar.AsyncState == target
//BeginConnect同样可能会引起上述的异常,但是只用一般的try无法捕捉。
//这些异常可以在回调方法中捕捉
//通过target传递socket对象
//在回调方法中使用以下代码
public static void AsyncCallback(IAsyncResult ar);
{
    Socket socket = (Socket)ar.AsyncState;
    try
    {
        //socket代码块
    }
    catch(SocketException se)
    {
        try
        {
            socket.EndConnect(ar);
        }catch{}
    }
}
//若链接异常,调用socket方法时会抛出一个SocketException异常,指示套接字没有链接。
//BeginConnect出现的异常会在EndConnect中抛出。

发送

发送二进制信息

string str ;
byte[] b = Encoding.ASCII.GetBytes(str);//把字符串编码为字节
sc.Send(b, b.Length, 0);//发送信息

接收

接收二进制信息

byte[] b = new byte[1024];
sc.Receive(b, b.Length, 0);//接受返回信息
//注意
int Receive(byte[] b,int size,SocketFlags sf)
//size 指示最多接受多少个字节到缓冲区,因此不能超出缓冲区范围。
//方法返回实际接受到多少个字节。
//该方法一次未必能返回全部数据,即使数据规模小于缓冲区(多次发送?)
//若没有任何数据,线程会一直挂着,直到引发超时异常或者出现新的信息。

解决上述问题的一些想法

//1.未知数据规模,格式
while(true)
{
    try
    {
        socket.Receive(b,b.lenget,0);
        //保存接收到的信息
    }catch(Socketxception sc)
    {
        //超时,离开循环
        break;
    }
}
//2.已知数据规模
int n,m;//n为数据规模
while(true)
{
 m += socket.Receive(b,b.lenget,0);
 if(m==n)break;
}
//3.已知数据格式,如HTML文件一般以结尾
while(true)
{
    socket.Receive(b,b.lenget,0);   
    //保存接收到的数据
    //判断数据是否完整,跳出循环 
}
//4.已知需求数据的格式,如HTML文件中的
,跳出循环,断开连接。 }
相关文章
最新文章
热点推荐