-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地址和端口
}
}