---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
IP和端口
端口是为了满足不同IP地之间的不同程序连接来识别程序的东东(IP找电脑,端口找程序)。端口是程序主动地绑定的,而并不是分配的,同一个应用程序绑定的端口号都是相同的。不让(某个应用程序)上网实际上就是把端口封掉了。
socket原意“孔”,插座,作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。套接字本身不能跟外界通信,需要通过系统套接字跟外界通信(类似多线程)。
Internet上有很多的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同、的服务(应用程序)。例如:http:80端口,ftp:21端口,smtp:23端口
有两种套接字发送方式:一种基于流的,一种基于报文的。基于流的是一种面向连接的Tcp服务应用,安全但效率低。数据报式的socket(datagram)是一种无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要重发),但效率高。
基于流式的socket必须有服务端和客户端。客户端创建请求,服务端(serverprocess)必须许有一个负责迎接(接受套接字)的socket,然后负责接受的套接字专门创建一个套接字与请求连接。
服务端socket(至少有两个):一个负责接受客户端连接请求(但不负责与客户端通信),每接收一个客户端的连接便在服务端产生一个对应的socket(在接收到客户端连接时创建,为每个连接成功的客户端请求在服务端都创建一个对应的socket(负责和客户端通信))。
客户端的socket:必须指定要连接的服务端地址和端口,通过创建一个socket对象来初始化一个到服务器端的tcp连接。
服务端设置
步骤:服务端(1)引入命名空间:system.net、 system.net.socket
(2)创建负责监听的套接字(参数用IP4寻址协议,流式连接,tcp协议传输数据)
(3)获得文本框中IP地址(IPAddress)
(4)创建包含IP和Port的网络节点对象(IPEndPoint)
(5)将负责监听的套接字绑定到唯一的IP和端口上(socketWatch.bind(endpoint))
(6)设置监听队列的长度SocketWatch.listen(10);
(7)创建负责通信的新的套接字(socketWatch.accept()有返回值)微软自带的网络工具运行》》telnet +“”+地址+“”+端口号
服务端前台界面:文本框中的IP地址和端口号分别是用本机的服务器工具生成的,不可与工具同时运行。
服务端后台代码:《单线程条件下,改装后的多线程在下边》
private void button1_Click(object sender, EventArgs e)
{
//创建服务端负责监听的套接字,里边的参数分别是(寻址方法是Internetwork(ipv4),连接方式是流式连接,传输方式选择tcp协议)
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//为服务器创建IP地址,获得文本框中的IP地址对象
IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());
//将网络端点表示为IP地址和端口号(将端口号绑定到IP地址):创建包含IP地址和端口号的网络端点对象
IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));
//将负责监听的套接字绑定到唯一的IP地址和端口上
socketWatch.Bind(endpoint);
//(设置监听队列的长度)设置最多监听的数量,多的不予回应处理同时有多个人访问的情况,根据服务器来设置
socketWatch.Listen(10);
//客户端与服务端连接成功,创建新的连接:开始监听客户端连接请求,注意:阻断当前线程
Socket socConnection= socketWatch.Accept();//为新建连接创建新的socket
//连接成功,服务端显示信息
ShowMsg("连接成功");
}
void ShowMsg(string msg)
{
txt_msg.AppendText(msg + "\r\n");
}
测试:cmd>>telnet 127.0.0.1 32768 》》go,>>>>服务器端的大文本框显示连接成功
多线程改装上述服务端后台代码
public partial class ChatServer : Form
{
public ChatServer()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//关闭微软自带的检查,可以让一个线程操作一个UI线程
}
Thread threadWatch = null;//创建服务端多线程
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//服务端负责监听的套接字
private void button1_Click(object sender, EventArgs e)
{
//创建服务端负责监听的套接字,里边的参数分别是(寻址方法是Internetwork(ipv4),连接方式是流式连接,传输方式选择tcp协议)
//为服务器创建IP地址,获得文本框中的IP地址对象
IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());
//将网络端点表示为IP地址和端口号(将端口号绑定到IP地址):创建包含IP地址和端口号的网络端点对象
IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));
//将负责监听的套接字绑定到唯一的IP地址和端口上
socketWatch.Bind(endpoint);
//(设置监听队列的长度)设置最多监听的数量,多的不予回应,处理同时有多个人访问的情况,根据服务器来设置
socketWatch.Listen(10);
threadWatch = new Thread(watchConnection);//调用委托
threadWatch.IsBackground = true;//设置为后台线程
threadWatch.Start();//开启线程
//连接成功,服务端显示信息
ShowMsg("服务端启动监听成功");
}
void watchConnection()
{
while (true)//持续不断的监听客户端的连接请求
{
//客户端与服务端连接成功,创建新的连接:开始监听客户端连接请求,注意:阻断当前线程
Socket socConnection = socketWatch.Accept();//为新建连接创建新的socket,一旦监听到客户端请求就返回一个负责和客户端通信的套接字socConnection
ShowMsg("客户端连接成功");
}
}
void ShowMsg(string msg)
{
txt_msg.AppendText(msg + "\r\n");
}
}
客户端:
private void btn_con_Click(object sender, EventArgs e)
{
IPAddress address=IPAddress.Parse(txt_IP.Text.Trim());//IP
IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));//端点包含IP和端口
//创建套接字
Socket socketConn=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//socketConn.Accep服务端专用,负责接收
socketConn.Connect(endpoint);//由套接字向此端口发出请求
}
同时启动两个项目,先运行一个,然后右键另外一个项目名称成》》调试》》启动新实例
--------------------- ASP.Net+Android+IO开发S、 .Net培训、期待与您交流! ----------------------